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”时才起作用?
答案 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
返回成功扫描的项目数。