Почему мы будем называть cin.clear() и cin.ignore() после чтения ввода?
Учебник Google Code University С++ использовал этот код:
// 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
?
Ответы
Ответ 1
cin.clear()
очищает флаг ошибки cin
(так что будущие операции ввода-вывода будут работать правильно), а затем cin.ignore(10000, '\n')
переходит к следующей новой строке (чтобы игнорировать что-либо еще в той же строке, -number, чтобы он не вызывал другого сбоя анализа). Он будет пропускать только до 10000 символов, поэтому код предполагает, что пользователь не будет вводить очень длинную недопустимую строку.
Ответ 2
Вы вводите
if (!(cin >> input_var))
если возникает ошибка при вводе данных из cin. Если возникает ошибка, устанавливается флаг ошибки, и будущие попытки получить ввод не удастся. Вот почему вам нужно
cin.clear();
чтобы избавиться от флага ошибки. Кроме того, вход, который вышел из строя, будет сидеть в том, что я предполагаю, является своего рода буфером. Когда вы попытаетесь получить ввод снова, он будет считывать один и тот же вход в буфере, и он снова сработает. Вот почему вам нужно
cin.ignore(10000,'\n');
Он вынимает 10000 символов из буфера, но останавливается, если встречает новую строку (\n). 10000 - это просто общая ценность.
Ответ 3
используйте cin.ignore(1000,'\n')
, чтобы очистить все символы предыдущего cin.get()
в буфере, и он остановится, когда сначала встретит '\n' или 1000 chars
.