C++使用CIN。For(),CIN。Car()。我有无限循环,不知道为什么
你能不能先使用cin,然后再使用cin。像这样在同一行中失败?是否有一种更干净或更标准的方法来对输入进行这种类型的错误检查?-也许暂时不使用doC++使用CIN。For(),CIN。Car()。我有无限循环,不知道为什么,c++,C++,你能不能先使用cin,然后再使用cin。像这样在同一行中失败?是否有一种更干净或更标准的方法来对输入进行这种类型的错误检查?-也许暂时不使用do do { cin.clear(); cout << "\nPlease enter the size of the array (1-10): "; } while (cin >> array_size && array_size <= 1 || array_size >= 10
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移动到内部loop@ta.speot.is:这与运算符优先级没有多大关系。@TonyD,LightnessRacesinOrbit在阅读代码时,我没有像应该的那样小心。你们都是对的。事实证明,下面的代码工作得非常好。但是由于if语句中的某些原因,如果我将cin.ignore放在cin.clear之前,将出现一个无限循环。你认为这是为什么?另外,如果我不使用if语句并将cin.ignore放在cout语句之前,它将不会打印,并且在循环退出之前大约有6或7个cin。代码没有格式化,所以我把它放在我的第一篇文章中。一个无限循环将发生。你认为这是为什么因为当流处于错误状态(即未清除)时,包括忽略在内的进一步操作将被跳过。我将在我的答案中添加如何实现循环,以便您可以将结果与…一件小事。。。如果用户键入-3-3,cin.ignore将不会忽略第二个-3。我以为它会一直忽略,直到找到新行,而不是一元运算符。@LordWalden:在-3-3场景中,在cin>>kids_total之后,如果你真的调用它,ignore确实会删除第二个-3,但是因为kids_total的输入有效,所以不会设置失败标志,你的代码和我的代码都不会调用ignore。如果你认为应该,最好改变它。干杯
cin >> array_size && array_size <= 1 || array_size >= 10 || cin.fail()
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');
}
}