您可以不使用cin和cin.fail()这样的一行吗?是否有一种更干净或更标准的方法来对输入进行这种类型的错误检查?
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);发布于 2014-11-20 07:55:40
cin >> array_size && array_size <= 1 || array_size >= 10 || cin.fail()假设在cin中有一个字母,cin >> array_size评估false,因此&&短路评估跳过array_size <= 1进行测试:
array_size >= 10:可能是未初始化的内存读取==>未定义的行为,否则想必是falsecin.fail() -绝对是true...unless有一些未定义的行为--甚至可能是那样--循环将继续进行,而不会删除cin中的字母,但会立即再次失败。
检查cin.ignore是否有删除失败解析的输入的方法,或者使用std::getline(std::cin, my_string)、std::istringstream iss(my_string); if (iss >> array_size等方法来保证整个行在错误的输入上被丢弃.
作为比较,这是相当健壮和IMHO直观,如果冗长。如果多做一次,只需创建一个函数.
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');
}
}https://stackoverflow.com/questions/27034299
复制相似问题