Что такое cin.peek и для чего он нужен? - PullRequest
0 голосов
/ 23 ноября 2018
#include <iostream>
using namespace std;
int main() 
{
//Declare data types
int NumChild; //var
const int BaseFee = 150; //constant

//Welcome + Instructions for users
cout << "Welcome to IOU Secondary School" << endl <<endl<< "How many 
children are attending the school this year? "<<endl;

//Nested IF-ELSE (error checking)
if (cin >> NumChild)/

    {

        //do not accept any non-integer values
        if (cin.peek() == EOF|| cin.peek() == '\n' )
        {

        }
        else
        { 

            cout <<endl<< "Error: enter a whole number."<<endl<< "The total 
   amount below represents the initial number entered e.g. if 5.7 is entered, the fee will be calculated according to 5 children" << endl;//error message for float entry
            cin.ignore(100, '\n'); //read and discard up to 100 characters from the input buffer, or until a newline is read
            cin.clear();//resets any error flags in the cin stream

        }
    }
    else
    {
        // Edit: You should probably also clear the steam
        cin.ignore(100, '\n');//read and discard up to 100 characters from 
        the input buffer, or until a newline is read
        cin.clear(); //resets any error flags in the cin stream
        cout << "Error: Restart the program and enter a number";

    }

    //nested IF statement (Calculation of fees)
if(NumChild == 1) //1 child attending
{
cout<<endl<<"The total cost of your child's fees are $"<< BaseFee+50 << 
endl;
}

if(NumChild == 2) //2 children attending
  {
cout<<endl<<"The total cost of your children's fees are $"<< (BaseFee*2)+85 
<< endl;
  }

if(NumChild == 3)//3 children attending
  {
cout<<endl<<"The total cost of your children's fees are $"<< (BaseFee*3)+110 
<< endl;
  }

if(NumChild > 3) //More than children attending
  {
cout<<endl<<"The total cost of your children's fees are $"<< 
(BaseFee*NumChild)+150 << endl;
  }
}

Может кто-нибудь объяснить, что такое оператор cin.peek и что он делает в приведенном выше коде?Как EOF|| cin.peek() == '\n') влияет на это.

Когда я ввожу значение с плавающей запятой, активируется первое значение, но результат все равно отображается.Как мне адаптировать код, чтобы общая сумма не отображалась?

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

функция 'peek' для входных потоков (в вашем случае 'cin') извлекает следующий символ из потока, фактически не потребляя его.Это означает, что вы можете «просмотреть» следующий символ на входе и при следующем вызове любой потребляющей операции (перегруженный оператор >> или cin.read) прочитает этот символ и потребит его.

Условиеeof() || cin.peek == '\n' проверяет, достигнут ли конец потока входного файла или если при использовании был введен символ новой строки.

Относительно вашего другого вопроса: В случае неверного ввода (например, значения с плавающей запятой), выне выходите из функции.Таким образом, вы продолжаете выполнение и, следовательно, печатаете значение.Просто выйдите из функции, используя return 1;.

0 голосов
/ 23 ноября 2018

peek смотрит на символ, не удаляя его из потока .Этот код проверяет, чтобы убедиться, что следующий символ в потоке является концом файла или концом строки, не извлекая символ из потока и не повреждая последующий допустимый ввод.

Он не может принять число с плавающей запятой, потому что cin >> NumChild прочитает int и остановится, как только достигнет десятичной точки.Пример: введите «3.14».numChild будет содержать 3. ".14" остается в потоке, поэтому peek будет читать '.', а не конец файла или новую строку, и печатает сообщение об ошибке.

Затем оно продолжаетсяс остальной частью программы, потому что ничто не сказало это остановить.Вам необходим цикл вокруг ввода, чтобы продолжать запрашивать больше ввода, пока не будет предоставлен действительный ввод.

Простой пример:

bool goodInput = false;
while (!goodInput)
{
    your code here
    if (cin.peek() == EOF|| cin.peek() == '\n' )
    {
        goodInput = true; // change made here
    } 
    your code here
}
...