首页 > 解决方案 > 为什么仅当我在第一个 scanf 中输入一个字符时,签证的 scanf 才有效?

问题描述

int main(){

char name;
int visanum;

printf("What is your first name?:");
scanf("%c",&name);


printf("what is your visa number?:");
scanf("%d",&visanum);

if(visanum>=12350 && visanum<=12380){
printf("Your visa is valid please go to counter 4\n");}

else if(visanum>=12300 && visanum<12350){
printf("Sorry! your visa needs to be validated please check with the US embassy\n");}

else if(visanum>12380 && visanum<=12399){
printf("Sorry! your visa needs to be validated please check with the US embassy\n");}

else{
printf("your visa is not valid\n");}

return 0;
}

标签: c

解决方案


您需要检查返回的值scanf。更准确地说,如果您输入“foo”作为名称,则scanf使用f并将其放入name. 当第二个 scanf 被执行时,它看到oo并且不消耗任何东西,因为这些字符不能被解释为浮点数。所以scanf返回 0 并且不分配任何东西给visanum. 由于visanum未初始化,尝试将其与 12350 和 12380 进行比较会调用未定义的行为,并且没有必要考虑会发生什么。

必须 始终检查返回的值scanf。在这种情况下,如果它不返回 1,程序应该打印一条错误消息并中止。

可能,您只想执行以下操作:

char name[128] = "";
int visanum = -1;

printf("What is your first name?:");
if( scanf("%127s",name) != 1 ){
    fprintf(stderr, "Invalid input\n");
    exit(EXIT_FAILURE);
}; 
...

推荐阅读