Можете ли вы не использовать cin, а затем cin.fail() в той же строке, как это? Есть ли более чистый или более стандартный способ проверки этого типа ошибок при вводе? --perhaps не использует do-while.
do {
cin.clear();
cout << "\nPlease enter the size of the array (1-10): ";
} while (cin >> array_size && array_size <= 1 || array_size >= 10 || cin.fail());
Это работает:
do {
cout << "Please input #: ";
if (cin.fail()){
cin.clear();
cin.ignore(80, '\n');
}
cin >> kids_total;
} while (cin.fail() || kids_total <= 0);
cin >> array_size && array_size <= 1 || array_size >= 10 || cin.fail()
Скажем, вы получили письмо следующего в cin
, cin >> array_size
оценивает false
так &&
короткого замыкания evalusation пропускает array_size <= 1
для теста:
array_size >= 10
: может быть неинициализированное чтение памяти ==> неопределенное поведение, иначе предположительно false
cin.fail()
- определенно true
... если нет неопределенного поведения - и, возможно, даже тогда - цикл будет продолжаться, не удалив письмо из cin
, только для немедленного сбоя.
Проверьте cin.ignore
на способ удаления ввода, который не прошел синтаксический анализ, или используйте std::getline(std::cin, my_string)
, std::istringstream iss(my_string); if (iss >> array_size
std::istringstream iss(my_string); if (iss >> array_size
и т.д. для того, чтобы гарантировать, что вся строка отброшена на плохой вход....
Для сравнения, это довольно надежный и ИМХО интуитивно понятный, если многословный. Если вы делаете это несколько раз, просто создайте функцию....
while (true)
{
std::cout << "Please input #: ";
if (std::cin >> kids_total)
{
if (kids_total > 0)
break;
std::cout << "Value must be > 0, please try again.\n";
}
else if (std::cin.eof())
{
// rare for keyboard input - e.g. ^D on UNIX/Linux, ^Z Windows
// can happen with pipes/redirects - e.g. echo 10 20 | ./my_app
std::cerr << "expected value for kids_total but encountered end of input\n";
exit(EXIT_FAILURE);
}
else
{
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
}
ignore
, просто пропускаются. Я добавлю, как я реализую цикл в своем ответе, чтобы вы могли сравнить с тем, что вы в конечном итоге ....