Когда ввод, заданный для std::cin
, не может быть преобразован в тип переменной, которую он запишет, он входит в состояние ошибки, к которому можно обратиться с помощью cin.fail()
(или синонимов, таких как !cin
).Если он возвращает true
(что означает, что failbit
потока установлено), то это означает, что преобразование не удалось.Находясь в этом состоянии сбоя, cin откажется читать любые данные до тех пор, пока не будет очищен * 1006. *
В строках, где вы читаете числа от пользователя, вы должны использовать цикл, который проверяет состояние сбояпоток, если он возвращает false
, затем продолжит нормальное выполнение, в противном случае вызовите std::cin.clear()
, чтобы очистить failbit
, чтобы cin
мог продолжить чтение как обычно.
Имейте в виду, что ошибочный вводвсе еще будет в потоке (т. е. введенное вами «е» все равно будет там, поэтому, если этот ввод снова будет считан как int, он снова не будет выполнен), поэтому вызовите std::cin.ignore(<A big number like 256>,'\n')
, чтобы пропустить неверный / ошибочный ввод,при запросе у пользователя правильного ввода (количество пропущенных символов - это количество символов, которое он должен пропустить).Аргумент '\ n' означает, что все символы в потоке игнорируются до следующей строки, без этого пользователю пришлось бы вводить 256 символов.