c - 为什么仅当我在第一个 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;
}
解决方案
您需要检查返回的值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);
};
...
推荐阅读
- openmodelica - 在模型中导入 MSL 中包含的现有 Modelica 模块
- javascript - 数据表中带括号的正则表达式
- python - 我的 RGB 到 HEX 转换器出了什么问题
- c# - 如何裁剪具有平滑边框的图像的椭圆区域
- c++ - C ++,使用模板调用成员函数上的线程
- reactjs - “从 2D 数据进行预测”代码实验室在每次刷新时给出随机结果
- c# - 如何在 ac# 类中添加 css bootstrap?
- git - GitHub 找到在 git cli 上找不到的提交
- ios - 删除特定约束后,此错误是什么意思?
- android - 错误 MSB4094:如何归档我的项目?