Когда cin встречает вход, он не может правильно прочитать указанную переменную (например, ввод символа в целочисленную переменную), он переходит в состояние ошибки и оставляет вход в его буфер.
Чтобы справиться с этим сценарием, вам нужно сделать несколько вещей.
- Вы должны проверить это состояние ошибки.
- Вам необходимо очистить состояние ошибки.
- Вы должны либо альтернативно обрабатывать входные данные, которые генерировали состояние ошибки, либо вымывать их и перепроектировать пользователя.
В следующем коде представлен один из многочисленных способов выполнения этих трех действий.
#include<iostream>
#include<limits>
using namespace std;
int main()
{
cout << "Enter an int: ";
int x = 0;
while(!(cin >> x)){
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Invalid input. Try again: ";
}
cout << "You enterd: " << x << endl;
}
Вы можете просто передать в каком-то большом значении для cin.ignore как 1000, и это, вероятно, ведут себя точно так же для всех практических целей.
Вы можете также проверить cin после попытки ввода и обработать его таким образом, что-то вроде if (! Cin) {// очистить ошибку}.
Заканчивать ссылка IStream для других функций-членов для обработки потока состояния: http://cplusplus.com/reference/iostream/istream/
Прочитайте все в строку и проанализируйте ввод соответственно? – Rhexis
Используйте cin.get(), а затем проверьте символ EOF? – Ansari