切换大小写0:输入0并输入字母

时间:2019-11-06 15:15:57

标签: c switch-statement

int DisplaySchedule()
{
    int nDisplaySchedule_Choice;

    system("cls");
    printf("----- DISPLAY SCHEDULE -----\n");
    printf("Pick departure station\n\t");
    printf("[1] San Pedro\n\t");
    printf("[2] Santa Rosa\n\t");
    printf("[3] Calamba\n\n\t");
    printf("[9] Go Back\n\t");
    printf("[0] Exit\n\n");
    printf("Choice: ");
    scanf("%d", &nDisplaySchedule_Choice);
    printf("\n");

    switch (nDisplaySchedule_Choice) {
        case 1: SanPedro(); break;
        case 2: SantaRosa(); break;
        case 3: Calamba(); break;
        case 9: OpeningScreen(); break;
        case 0: printf("Summary()"); break;
        default:
            printf("ERROR. INPUT A VALID RESPONSE.\n\n");
            DisplaySchedule();
            break;
    }
    return;
}

我有此代码,当我输入字母时,它不打印错误消息,而是打印case 0:。我有什么办法可以使case 0:仅在且仅当我在scanf语句中输入“ 0”时才起作用?

2 个答案:

答案 0 :(得分:2)

如果scanf无法读取一个值(例如,因为您告诉它读取一个int并给了它一个字母),它将不会更改您的变量。因此,nDisplaySchedule_Choice不会以您可以签入switch的方式进行更改。至少如果您不初始化它,则不会-您可以将其设置为switch未涵盖的值,并且如果它没有更改,您就会知道scanf无法读取一个值。

或者您可以检查return value of scanf来查看它是否能够读取值:

int result = scanf("%d", &nDisplaySchedule_Choice);
if (result == 0) {
    int c;
    while ((c = getchar()) != '\n' && c != EOF); // flush the invalid input
    printf("ERROR. INPUT A VALID RESPONSE.\n\n");
    DisplaySchedule();
}
else switch ...

答案 1 :(得分:2)

您这里有undefined behaviour

scanf在扫描int(%d)时失败,因为您输入了字符-由于匹配失败。因此根本不读任何东西到nDisplaySchedule_Choice中。

由于nDisplaySchedule_Choice最初未初始化,因此它刚好具有0,因此转到case 0

解决方案是在继续使用scanf之前检查nDisplaySchedule_Choice的返回值。 scanf返回成功扫描的项目数。