C 切换案例0:输入0并输入字母

C 切换案例0:输入0并输入字母,c,switch-statement,C,Switch Statement,我有一个代码,当我输入一个字母时,它不会打印错误消息,而是打印案例0:。是否有任何方法可以使案例0:仅当且仅当我在scanf语句中输入“0”时才会起作用?如果scanf无法读取值(例如,因为您告诉它读取int并给它一个字母),它将不会更改您的变量。因此,nDisplaySchedule\u选项不会以您可以签入开关的方式更改。如果您不初始化它,至少不会这样做-但是您可以将它设置为开关未包含的值,如果它没有更改,您就知道scanf无法读取值 或者,您可以检查以查看它是否能够读取值: int Disp

我有一个代码,当我输入一个字母时,它不会打印错误消息,而是打印
案例0:
。是否有任何方法可以使
案例0:
仅当且仅当我在
scanf
语句中输入“0”时才会起作用?

如果
scanf
无法读取值(例如,因为您告诉它读取
int
并给它一个字母),它将不会更改您的变量。因此,
nDisplaySchedule\u选项
不会以您可以签入
开关的方式更改。如果您不初始化它,至少不会这样做-但是您可以将它设置为
开关
未包含的值,如果它没有更改,您就知道
scanf
无法读取值

或者,您可以检查以查看它是否能够读取值:

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

如果
scanf
无法读取值(例如,因为您告诉它读取
int
并给它一个字母),它将不会更改您的变量。因此,
nDisplaySchedule\u选项
不会以您可以签入
开关的方式更改。如果您不初始化它,至少不会这样做-但是您可以将它设置为
开关
未包含的值,如果它没有更改,您就知道
scanf
无法读取值

或者,您可以检查以查看它是否能够读取值:

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;
}
你在这里有

scanf
,在扫描int(
%d
)时失败,因为您输入了一个字符-由于匹配失败。因此,根本不需要将任何内容读入
nDisplaySchedule\u选项

由于
nDisplaySchedule\u选项
一开始未初始化,因此它恰好有
0
,因此转到
案例0

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

您在这里看到了

scanf
,在扫描int(
%d
)时失败,因为您输入了一个字符-由于匹配失败。因此,根本不需要将任何内容读入
nDisplaySchedule\u选项

由于
nDisplaySchedule\u选项
一开始未初始化,因此它恰好有
0
,因此转到
案例0


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

始终检查
scanf
的返回值。您可以将
nDisplaySchedule\u选项设置为“错误”值(例如,-1)在调用
scanf
之前-如果给出无效输入,它将保持在此值。您也可以将
nDisplaySchedule\u Choice
初始化为无效值(如
-1
)。可能重复@anatolyg是的,这是重复的,但那里的答案质量相当低。我希望有一个好的答案来处理
scanf
的结果,或者显示一个
fgets
备选方案。始终检查
scanf
的返回值。您可以将
nDisplaySchedule\u选项设置为“错误”值(例如,-1)在调用
scanf
之前-如果给出无效输入,它将保持在此值。您也可以将
nDisplaySchedule\u Choice
初始化为无效值(如
-1
)。可能重复@anatolyg是的,这是重复的,但那里的答案质量相当低。我希望有一个好的答案来处理
scanf
的结果,或者显示一个
fgets
备选方案。