0

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

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

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

4

3 回答 3

5

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

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

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

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

于 2012-08-10T10:22:36.757 回答
1

请查看scanf手册页。

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

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

于 2012-08-10T10:24:22.477 回答
0

我试过 if(isdigit(choice)) 但问题仍然存在。如果输入的数据类型与 scanf 中的格式说明符不匹配,则此问题与缓冲区有关,则输入不会被 scanf 消耗并保留在缓冲区中。

为了解决这个问题,我尝试了 fflush(stdin),它适用于 windows 中的 c 编译器,但不适用于 linux,对不起,我不知道 fflush(stdin) 不适用于 linux 的原因。

我还尝试了在 Windows 和 linux 上运行良好的 getchar(),我将 getchar() 放在 loop 内的语句末尾。

 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;
        }

    getchar();
    } while (choice != 2);
于 2018-09-10T06:08:27.057 回答