C开关盒默认始终执行

时间:2014-09-15 19:50:17

标签: c while-loop switch-statement case default

while ((c = getchar()) != '4') {
    switch (c) {
        case '1':
            printf("You pressed 1");
            break;
        case '2':
            printf("You pressed 2");
            break;
        case '3':
            printf("You pressed 3");
            break;
        case '4':
            break;
        default:
            printf("%c Wrong input, try again\n", c);
            printMenu();
    }
}
return 0;

}

好的,所以我不明白为什么默认总是执行。当我按下1-3时它会在那种情况下打印按摩,并在它执行默认情况后立即打印。代码有什么问题?

5 个答案:

答案 0 :(得分:7)

如果您在控制台输入字符,那么您可能在输入后按Enter键。这将在getchar中显示为\n个字符,不会出现在您的switch个案例中。

您只需选择添加case '\n': break;即可忽略此情况。

答案 1 :(得分:2)

从联系手册:

   fgetc(), getc() and getchar() return the character read as an
   unsigned char cast to an int or EOF on end of file or error.

我会尝试将该字符打印为charint,以查看正在进行的操作。

  while ((c = getchar()) != '4') {
+     printf( "c = %c (%d)\n", (char) c, c );
      switch (c) {

通常,这足以理解和解决问题: - )

答案 2 :(得分:1)

我认为问题在于那些中断不会破坏while循环,只会破坏交换机。您可能输入1和enter,因此新行将被读取为getchar中的第二个字符。

答案 3 :(得分:1)

当您使用scanf阅读角色时 - 您将输入y并按。 y将被分配给选项(即选项 - Y)并将在缓冲区中。当您调用scanf时,缓冲区中的下一个时间将被分配给选项,因此转到默认情况。为了避免这种情况,请在scanf中的%c之前留一个空格。在整数或浮点数的情况下不会发生这种情况。

使用以下代码获得预期结果:

while ((c = getchar()) != '4') {
    getchar();
    switch (c) {
        case '1':
            printf("You pressed 1\n");
            break;
        case '2':
            printf("You pressed 2\n");
            break;
        case '3':
            printf("You pressed 3\n");
            break;
        case '4':
            break;
        default:
            printf("%c Wrong input, try again\n", c);
            //printMenu();
    }

答案 4 :(得分:-6)

将默认值添加到默认值。多数民众赞成在哪里。