Циклы std :: cin, даже если я вызываю ignore () и clear ()

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

Я искал решения и пыталсяignore() а такжеclear(), но это все еще не останавливается.

Не могли бы вы исправить меня, где я здесь не так?

int num;
cin >> num;
while (cin.fail()) {
  cin.ignore();
  cin.clear();
  cout << "Enter valid number: " << endl;
  cin >> num;
}
 WhozCraig31 июл. 2016 г., 05:36
Ваш заголовок не соответствует опубликованному коду; ты не делаешьclear() а такжеignore(); ты делаешьignore() а такжеclear(), Порядок важен.
 Thomas Matthews31 июл. 2016 г., 05:40
КСТАТИ,cin.clear не очищает входной буфер; только флаги состояния.

Ответы на вопрос(2)

ignore() не имеет никакого эффекта, когда поток находится в состоянии сбоя, поэтомуclear() первый.

Решение Вопроса

Когда поток находится в состоянии ошибки,

  cin.ignore();

ничего не делает Вам нужно позвонитьcin.clear() сначала перед звонкомcin.ignore().

Также,cin.ignore() будет игнорировать только один символ. Чтобы игнорировать строку ввода, используйте:

cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

добавлять

#include <limits>

быть в состоянии использоватьstd::numeric_limits.

Исправленный блок кода будет выглядеть примерно так:

int num;
while ( !(cin >> num) ) {
   cin.clear();
   cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
   cout << "Enter valid number: " << endl;
}

Ваш ответ на вопрос