开关默认值不显示

Switch default is not showing when it should

在我使用 switch 的 C 程序中,我的 int 变量有问题。 我的代码是:

while(1) {
    printf("0. END\n1. TRANSLATE\n2. TEST FROM LESSON\n3. RANDOM"
            " WORDS TEST\n4. SHOW DICTIONARY\n5. ADD WORD\n"
            "6. DELETE WORD\nYOUR CHOICE: ");
    
    scanf("%d",&option);
    fflush(stdin);
    printf("\n");

    switch(option) {
        case 0: {
            exit(0);
            break;
        }
        
        case 1: {
            system("cls");
            translate();
            printf("\n");

            break;
        }

        case 2: {
            system("cls");
            lessons();
            printf("\n");
            
            break;
        }

        case 3: {
            randomFromLessons();
            printf("\n");
            
            break;
        }

        case 4: {
            system("cls");
            allWords();
            printf("\n");
            
            break;
        }

        case 5: {
            system("cls");
            addWord();

            break;
        }
        
        case 6: {
            system("cls");
            deleteWord();
            printf("\n");
            
            break;
        }
        
        default: {
            printf("---------------\n");
            printf("WRONG VALUE.\n");
            printf("---------------\n\n");
        }   
    }
    
}

当我在选项 var 中输入 'd' 时。它显示默认值,这是我想要的,但是当我按数字 1 启动名为“translate()”的方法然后返回主菜单并再次按 'd' 它让我回到“translate()”而不是显示默认值。

当我使用 char 而不是 int 时,没有问题。 那么,到底是什么问题呢?什么一直在发生?我究竟做错了什么?那么在 switch 中使用 char 不是最好的选择吗?

如果您希望允许文本输入,您应该使用 fgets 将输入读取为字符串,然后根据需要转换为整数。

如果你只想接受数字,你应该检查 scanf 的结果看它是否成功 - 在这种情况下它会 return 1 当成功时,以防万一它设法读取了 1 个参数。如果不成功,它不会覆盖 option 但会保留以前的值 - 这就是为什么你会得到你描述的行为。

此外,fflush(stdin); 是未定义的行为,因为 fflush 从未打算用于输入流。要从标准输入中丢弃换行符,您可以添加单个 getchar().

所以你可以将代码修改成这样:

int result;

while(1)
{
  result = scanf("%d",&option);
  getchar();
  if(result == 1)
    break;
  else
    printf("some error message\n");
}

switch(option)
...