你能不能在同一行中使用cin然后使用cin.fail()?在输入时是否有更简洁或更标准的方法来执行此类错误检查? - 可能不使用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);
答案 0 :(得分:0)
cin >> array_size && array_size <= 1 || array_size >= 10 || cin.fail()
假设您在cin
后面有一封信,cin >> array_size
评估false
,以便&&
短路评估跳过array_size <= 1
测试:
array_size >= 10
:可能是未初始化的内存读取==&gt;未定义的行为,否则可能是false
cin.fail()
- 绝对true
...除非出现未定义的行为 - 甚至可能是这样 - 否则循环将继续而已从cin
删除了该字母,只是立即再次失败。< / p>
检查cin.ignore
以了解删除解析失败的输入的方法,或使用std::getline(std::cin, my_string)
,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');
}
}