Подтвердить что ты не робот

Почему мы будем называть 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?

4b9b3361

Ответ 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.