Зачем нам звонить Син.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 63

3 ответа:

The cin.clear() очищает флаг ошибки cin (Так что будущие операции ввода-вывода будут работать правильно), а затем cin.ignore(10000, '\n') переход к следующей новой строке (чтобы игнорировать что-либо еще в той же строке, что и не-число, чтобы это не вызвало другого сбоя синтаксического анализа). Он будет пропускать только до 10000 символов, поэтому код предполагает, что пользователь не будет вставлять очень длинную недопустимую строку.

ввести

if (!(cin >> input_var))

оператор, если возникает ошибка при приеме входных данных от cin. Если возникает ошибка, то устанавливается флаг ошибки и будущие попытки получить ввод будут неудачными. Вот почему вам нужно

cin.clear();

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

cin.ignore(10000,'\n');

он извлекает 10000 символов из буфера, но останавливается, если он встречает новую строку (\n). 10000 - это просто общее большое значение.

использовать cin.ignore(1000,'\n') чтобы очистить все символы предыдущего cin.get() в буфере, и он решит остановиться, когда он встретит '\n ' или 1000 chars первый.