Switch case输入错误时无限循环
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Switch case输入错误时无限循环相关的知识,希望对你有一定的参考价值。
我有一个非常简单的代码段,其中有一个带有switch case的while循环,如下所示:
do {
printf("Enter Choice
");
scanf("%d", &choice);
switch(choice) {
case 1: printf("1 selected");
break;
case 2: printf("exit");
break;
default: printf("wrong input");
break;
}
} while (choice != 2);
在这段代码中,如果偶然我输入一个字符而不是一个数字,程序会无限循环,甚至不接受输入。我知道如果我插入可以纠正这个问题
if(isdigit(choice))
在进入开关盒之前。但我的问题是为什么它首先发生。
它不应该进入默认情况并再次要求输入吗?
如果scanf
无法将输入与格式说明符匹配,则将其保留在缓冲区中。所以下一次它仍然不会匹配等等。换句话说,它不会吃掉它无法比拟的东西。您必须检查scanf
返回的值(匹配项的数量),以确保输入是预期的。
或者,要跳过不需要的东西,你可以尝试(未经测试):
scanf("%*[^0-9]%d", &choice);
在尝试读取十进制整数之前,这应该丢弃任何不是数字的东西。
请查看scanf手册页。
如果输入中的下一个不是数字,在这种情况下它不会消耗它。
您需要检查scanf
的返回值,如果它为零,则使用下一个字符并重试(或者直到达到行尾)。
我试过if(isdigit(choice))但问题仍然存在。如果输入的数据类型与scanf中的格式说明符不匹配,则此问题与缓冲区有关,然后输入不会被scanf消耗并保留在缓冲区中。
为了解决这个问题,我尝试了fflush(stdin),它适用于Windows中的c编译器,但不适用于linux,抱歉,我不知道为什么fflush(stdin)不能在linux上工作。
我也试过getchar()在windows和linux上运行正常,我把getchar()放在循环语句的末尾。
do
{
printf("Enter Choice
");
scanf("%d", &choice);
switch(choice) {
case 1: printf("1 selected");
break;
case 2: printf("exit");
break;
default: printf("wrong input");
break;
}
getchar();
} while (choice != 2);
以上是关于Switch case输入错误时无限循环的主要内容,如果未能解决你的问题,请参考以下文章