Зачем нам звонить Син.clear () и cin.игнорировать () после чтения ввода?
учебник по C++ университета Google Code раньше был такой код:
// Description: Illustrate the use of cin to get input
// and how to recover from errors.
#include <iostream>
using namespace std;
int main()
{
int input_var = 0;
// Enter the do while loop and stay there until either
// a non-numeric is entered, or -1 is entered. Note that
// cin will accept any integer, 4, 40, 400, etc.
do {
cout << "Enter a number (-1 = quit): ";
// The following line accepts input from the keyboard into
// variable input_var.
// cin returns false if an input operation fails, that is, if
// something other than an int (the type of input_var) is entered.
if (!(cin >> input_var)) {
cout << "Please enter numbers only." << endl;
cin.clear();
cin.ignore(10000,'n');
}
if (input_var != -1) {
cout << "You entered " << input_var << endl;
}
}
while (input_var != -1);
cout << "All done." << endl;
return 0;
}
каково значение cin.clear()
и cin.ignore()
? Почему это 10000
и n
параметры нужны?
3 ответа:
The
cin.clear()
очищает флаг ошибкиcin
(Так что будущие операции ввода-вывода будут работать правильно), а затемcin.ignore(10000, '\n')
переход к следующей новой строке (чтобы игнорировать что-либо еще в той же строке, что и не-число, чтобы это не вызвало другого сбоя синтаксического анализа). Он будет пропускать только до 10000 символов, поэтому код предполагает, что пользователь не будет вставлять очень длинную недопустимую строку.
ввести
if (!(cin >> input_var))
оператор, если возникает ошибка при приеме входных данных от cin. Если возникает ошибка, то устанавливается флаг ошибки и будущие попытки получить ввод будут неудачными. Вот почему вам нужно
cin.clear();
чтобы избавиться от флага ошибки. Кроме того, вход, который потерпел неудачу, будет сидеть в том, что я предполагаю, является своего рода буфером. При попытке получить ввод снова, он будет читать тот же вход в буфере, и это снова не удастся. Вот почему ты нужно
cin.ignore(10000,'\n');
он извлекает 10000 символов из буфера, но останавливается, если он встречает новую строку (\n). 10000 - это просто общее большое значение.