我有一个非常简单的代码段,其中有一个带有switch case的while循环,如下所示:
do {
printf("Enter Choice\n");
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))
进入开关案例之前。但我的问题是为什么它首先发生。
不应该进入默认情况并再次要求输入吗?
答案 0 :(得分:5)
如果scanf
无法将输入与格式说明符匹配,则将其保留在缓冲区中。所以下一次它仍然不会匹配等等。换句话说,它不会吃掉它无法比拟的东西。您必须检查scanf
返回的值(匹配项的数量),以确保输入是预期的。
或者,要跳过不需要的东西,你可以尝试(未经测试):
scanf("%*[^0-9]%d", &choice);
在尝试读取十进制整数之前,这应该丢弃任何不是数字的东西。
答案 1 :(得分:1)