Причина, по которой программа переходит в бесконечный цикл, связана с тем, что флаг неудачного ввода std::cin
установлен из-за сбоя ввода. Необходимо сделать это, чтобы очистить этот флаг и отбросить плохой вход из входного буфера.
//executes loop if the input fails (e.g., no characters were read)
while (std::cout << "Enter a number" && !(std::cin >> num)) {
std::cin.clear(); //clear bad input flag
std::cin.ignore(std::numeric_limits::max(), '\n'); //discard input
std::cout << "Invalid input; please re-enter.\n";
}
См. C ++ FAQ для этого и другие примеры, включая добавление минимальный и / или максимальный в условие.
Другим способом было бы получить ввод как строку и преобразовать его в целое число с std::stoi
или другим методом, который позволяет проверять преобразование.