我想知道是否有人能告诉我为什么以下代码;
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收到非整数时的语句。
我假设这是因为userChoice存储为整数。我该如何防止这种情况发生?首先猜测是将其更改为字符串或字符,但想要更好的解释......
提前谢谢。
编辑:来自评论;
感谢您的回答和输入;
if'而不是switch语句是" Learning"的一部分。我是全新的,初学者挑战"如果想要它,然后改变它以使用开关。
括号,Code :: Blocks正在抛出编译器警告,所以我添加了它们......
使用不同的printf / scanf等是有道理的。
也许更具体地说我应该问;为什么当我输入" 6"时,它会正确地断开并返回到循环的顶部,但是当我输入" a"它会尽快重复打印出else语句
答案 0 :(得分:4)
当您使用*printf
时,最好与scanf( "%d", &userChoice )
结合使用,而不是cin
;
使用printf( <format>, <arg )
代替fprintf( stdout, ...
- 它是相同的;
有许多不必要的括号:while ((true))
,if ((userChoice == x))
;
要获得更具可读性的语法,请使用switch - case
代替所有这些if
- s;
无限循环似乎与while ( true )
一样,没有break
也不return
。
答案 1 :(得分:1)
简短回答:如果您进行了正确的错误检查,您就已经知道了答案。 (或者,至少比你现在更近)
userChoice
类型为int
时的长答案:std::cin >> userChoice;
在尝试解析a
时失败 。它对userChoice
的值没有任何作用,并在std::cin
上设置失败位。
由于userChoice
保留了之前的值,它只是重复之前选择的任何内容。
此外,下次执行std::cin >> userChoice;
时,您将在仍处于失败状态的流中执行此操作,因此操作不再执行任何操作。
修复:测试错误。如果您的错误处理决定继续循环,请确保清除标志以使std::cin
恢复正常状态。
答案 2 :(得分:0)
简单程序的简单解决方案:
std::cin >> userChoice; // insert the following lines
if (std::cin.fail())
{
std::cin.clear(std::ios::goodbit);
char c;
std::cin >>c;
}