This question already has answers here:
Infinite loop with cin when typing string while a number is expected
(4个答案)
4年前关闭。
我想知道是否有人可以告诉我下面的代码为什么?
当通过std::cin接收到非整数时,将导致无限循环而不是打印“else”语句。
我假设这是因为userChoice被存储为整数。我如何防止这种情况发生?首先猜测是将其更改为字符串或字符,但想要更好的解释...
先感谢您。
编辑:从评论;
感谢您的回答和输入;
如果不是,则使用if代替switch语句是“学习”的一部分。即时通讯是全新的,“初学者挑战”希望在if中使用它,然后将其更改为使用开关。 括号,Code::Blocks抛出编译器警告,所以我添加了它们... 使用不同的printf / scanf等是有意义的。
也许我应该问更具体些;为什么当我输入“6”时,它会正常中断并返回到循环的顶部,但是当我输入“a”时,它会尽可能快地反复打印else语句
(4个答案)
4年前关闭。
我想知道是否有人可以告诉我下面的代码为什么?
int main ()
{
while((true))
{
int userChoice;
//fprintf(stdout, "Press 1 for Coke.\nPress 2 for Sprite.\nPress 3 for Dr. Pepper.\nPress 4 for Mountain Dew.\nPress 5 for Monster.\nPress 6 for Help.\n\n");
fprintf(stdout, "What would you like? (Press 6 for assistance): ");
std::cin >> userChoice;
if ((userChoice == 1))
{
fprintf(stdout, "\nYou get a Coke and you get a Coke, EVERYONE GETS A COKE!\n\n");
}
else if ((userChoice == 2))
{
fprintf(stdout, "\nDispensing Sprite.\n\n");
}
else if ((userChoice == 3))
{
fprintf(stdout, "\nDropping the Dr. P!\n\n");
}
else if ((userChoice == 4))
{
fprintf(stdout, "\nDo the Dew!\n\n");
}
else if ((userChoice == 5))
{
fprintf(stdout, "\nHere's your Monster, but don't go crazy\n\n");
}
else
{
fprintf(stdout, "\nPress 1 for Coke.\nPress 2 for Sprite.\nPress 3 for Dr. Pepper.\nPress 4 for Mountain Dew.\nPress 5 for Monster.\nPress 6 for Help.\n\n");
}
}
}
当通过std::cin接收到非整数时,将导致无限循环而不是打印“else”语句。
我假设这是因为userChoice被存储为整数。我如何防止这种情况发生?首先猜测是将其更改为字符串或字符,但想要更好的解释...
先感谢您。
编辑:从评论;
感谢您的回答和输入;
也许我应该问更具体些;为什么当我输入“6”时,它会正常中断并返回到循环的顶部,但是当我输入“a”时,它会尽可能快地反复打印else语句
最佳答案
简短答案:如果您进行了正确的错误检查,那么您已经知道答案了。 (或者至少比您现在更近)
由于userChoice
的类型为int
,因此答案很长:std::cin >> userChoice;
在尝试解析a
时使失败。它对userChoice
的值不执行任何操作,并在std::cin
上设置失败位。
由于userChoice
保留了先前的值,因此它只会重复执行先前的选择。
此外,下次执行std::cin >> userChoice;
时,您将在仍处于失败状态的流上执行该操作,因此该操作不再执行任何操作。
解决:测试错误。并且,如果您的错误处理决定继续循环,请确保清除标志以使std::cin
返回良好状态。
关于c++ - 字符类型导致循环爆炸,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37837434/
10-10 03:46