Switch case输入错误时无限循环

时间:2012-08-10 10:19:32

标签: c switch-statement

我有一个非常简单的代码段,其中有一个带有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))

进入开关案例之前。但我的问题是为什么它首先发生。

不应该进入默认情况并再次要求输入吗?

2 个答案:

答案 0 :(得分:5)

如果scanf无法将输入与格式说明符匹配,则将其保留在缓冲区中。所以下一次它仍然不会匹配等等。换句话说,它不会吃掉它无法比拟的东西。您必须检查scanf返回的值(匹配项的数量),以确保输入是预期的。

或者,要跳过不需要的东西,你可以尝试(未经测试):

scanf("%*[^0-9]%d", &choice);

在尝试读取十进制整数之前,这应该丢弃任何不是数字的东西。

答案 1 :(得分:1)

请查看scanf手册页。

如果输入中的下一个不是数字,在这种情况下它不会消耗它。

您需要检查scanf的返回值,如果它为零,请使用下一个字符并重试(或者直到达到行尾)。