После вызова clear
вы также должны каким-то образом удалить неправильный ввод из потока. Вот один из способов:
cin >> arr[index];
if (!cin)
{
cin.clear();
std::string ignoreLine; //read the invalid input into it
std::getline(cin, ignoreLine); //read the line till next space
index--;
continue;
}
Это потому, что когда cin
не может прочитать неверный ввод, он остается там в потоке. Это должно быть удалено, каким-то образом. Я просто читаю и игнорирую это.
Вы также можете использовать ignore
как:
cin.clear();
cin.ignore(std::numeric_limits<streamsize>::max(),' ');
, что, на мой взгляд, лучше, если входные данные разделены пробелом (и если вы не хотите проверять неверный ввод). онлайн-документ говорит:
IStream :: игнорировать
istream & ignore (размер потока n = 1, int delim = EOF);
Извлечение и удаление символов
Извлекает символы из последовательности ввода и удаляет их.
Извлечение заканчивается, когда извлечено n символов
отбрасывается или когда найден разделитель символа, в зависимости от того, что произойдет раньше.
В последнем случае сам символ-разделитель также извлекается.