Что ж, у вас всегда будет бесконечный цикл, но я знаю, что вы действительно хотите знать, почему cin не продолжает запрашивать ввод для каждой итерации цикла, вызывая свободный запуск вашего бесконечного цикла.
Причина в том, что cin терпит неудачу в описываемой вами ситуации и больше не считывает входные данные для этих переменных. При неправильном вводе cin, cin переходит в состояние сбоя и перестает запрашивать командную строку для ввода, вызывая свободный цикл.
Для простой проверки вы можете попытаться использовать cin для проверки ваших входных данных, проверив, находится ли cin в состоянии сбоя. При возникновении сбоя очистить состояние сбоя и принудительно заставить поток выбросить неверный ввод . Это возвращает cin к нормальной работе, поэтому вы можете запросить дополнительные данные.
if (cin.fail())
{
cout << "ERROR -- You did not enter an integer";
// get rid of failure state
cin.clear();
// From Eric's answer (thanks Eric)
// discard 'bad' character(s)
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
Для более сложной проверки вы, возможно, захотите сначала прочитать строку и выполнить более сложные проверки строки, чтобы убедиться, что она соответствует ожидаемой вами.