美文网首页
调用scanf函数的一个陷阱

调用scanf函数的一个陷阱

作者: 胖一一 | 来源:发表于2019-02-26 20:28 被阅读0次

我们在写C程序时,经常使用scanf函数,让用户输入数据,可是有时候会出现一些很奇怪的问题。例如,下面的程序是一个简单的四则运算:

#include <stdio.h>  
  
int main()  
{  
char ope = '\0';//操作符+ - * /  
int para1 = 0, para2 = 0, result = 0;//para1是运算参数1,para2是运算参数2,result是运算结果  
  
printf("请输入第一个运算参数\n");  
scanf("%d",&para1);  
printf("请输入运算符 '+ - * /'\n");  
scanf("%c",&ope);  
printf("请输入第二个运算参数\n");  
scanf("%d",&para2);  
switch(ope)  
{  
case '+': result = para1 + para2;//如果运算符是+,就执行加法运算  
break;  
case '-': result = para1 - para2;//如果运算符是-,就执行减法运算  
break;  
case '*': result = para1 * para2;//如果运算符是*,就执行乘法运算  
break;  
case '/': result = para1 / para2;//如果运算符是/,就执行除法运算  
break;  
default: printf("运算符输入错误\n");//  
break;  
}  
printf("运算结果是: %d\n", result);  
return 0;      
}  

此程序不管从语法,还是逻辑上,都没有问题,且编译也能通过。实际运行时,却是如下结果:

image

在用户输入第一个运算参数后,按照程序的设定,应该让用户输入运算符,可是直接让用户输入第二个运算参数了。你能看出这是为什么吗?
我们修改下程序,如下:

#include <stdio.h>  
  
int main()  
{  
char ope = '\0';//操作符+ - * /  
int para1 = 0, para2 = 0, result = 0;//para1是运算参数1,para2是运算参数2,result是运算结果  
  
printf("请输入第一个运算参数\n");  
scanf("%d",&para1);  
printf("请输入运算符 '+ - * /'\n");  
scanf("%c",&ope);  
  
printf("运算符是: %d\n", ope);  
printf("请输入第二个运算参数\n");  
scanf("%d",&para2);//加入这两行代码  
switch(ope)  
{  
case '+': result = para1 + para2;//如果运算符是+,就执行加法运算  
break;  
case '-': result = para1 - para2;//如果运算符是-,就执行减法运算  
break;  
case '*': result = para1 * para2;//如果运算符是*,就执行乘法运算  
break;  
case '/': result = para1 / para2;//如果运算符是/,就执行除法运算  
break;  
default: printf("运算符输入错误\n");//  
break;  
}  
printf("运算结果是: %d\n", result);  
return 0;      
}  

我们加入两行代码,输出字符参数ope的ASCII码值,结果如下:

image

可以看到,ope的ASCII码值是10,正是换行符的ASCII码值。我们什么时候把换行符给了ope? 其实,在我们给运算参数para1赋值1的时候,我们按下了回车键,准备输入运算符,可是系统不懂啊,系统把回车键理解为换行符赋值给了ope,所以接下来会跳过让用户输入运算符而直接让用户输入运算参数2了,问题就在这里。

知道了问题所在,那么就好解决了。 请看:

#include <stdio.h>  
#include <conio.h>  
  
int main()  
{  
char ope = '\0';//操作符+ - * /  
int para1 = 0, para2 = 0, result = 0;//para1是运算参数1,para2是运算参数2,result是运算结果  
  
printf("请输入第一个运算参数\n");  
scanf("%d",&para1);  
getchar();  
  
printf("请输入运算符 '+ - * /'\n");  
scanf("%c",&ope);  
getchar();  
printf("运算符是: %d\n", ope);  
printf("请输入第二个运算参数\n");  
scanf("%d",&para2);  
switch(ope)  
{  
case '+': result = para1 + para2;//如果运算符是+,就执行加法运算  
break;  
case '-': result = para1 - para2;//如果运算符是-,就执行减法运算  
break;  
case '*': result = para1 * para2;//如果运算符是*,就执行乘法运算  
break;  
case '/': result = para1 / para2;//如果运算符是/,就执行除法运算  
break;  
default: printf("运算符输入错误\n");//  
break;  
}  
printf("运算结果是: %d\n", result);  
return 0;      
}  

在每次scanf结束后,加入getchar函数,即可。getchar函数从输入流中读取一个字符,因此可以接收我们每次按下的回车键,也就是换行符。运行结果如下:


image.png

相关文章

  • 调用scanf函数的一个陷阱

    我们在写C程序时,经常使用scanf函数,让用户输入数据,可是有时候会出现一些很奇怪的问题。例如,下面的程序是一个...

  • 2019-03-07

    main(主函数,主程序中主要函数,唯一性) printf(输出函数,程序中可调用函数) scanf(输入函数) ...

  • 【C语言笔记】<三>Scanf函数

    Scanf函数介绍 scanf函数是一个阻塞式函数:程序会停在Scanf函数出现的地方,直到接收到的数据才会执行后...

  • C语言中的scanf与scanf_s 以及循环输入的问题解决

    Scanf 在标准C中,scanf提供了键盘输入功能。 scanf函数是一个标准库函数,它的函数原型在头文件“st...

  • 2018-05-23总结

    熟悉利用函数查找字符串。 注意strcmp等算法调用的库。 定义的算法函数中尽量不要有scanf,要放在主函数ma...

  • cocos2dx中schedule的陷阱

    schedule里面有个陷阱: 如果你调用含target参数的shedule函数把一个回调函数callback交给...

  • RCTF2017赛后总结

    Rcalc 程序入口 看一下代码 在主函数中调用了scanf("%s", &name)来获取输入,很明显,这是一个...

  • 2019-01-05学习一下C呀

    问题1:vs2017中scanf函数报错ANSI C中没有scanf_s(),只有scanf(),scanf()在...

  • Python 函数相关的两个问题

    函数 开发陷阱(一): 可变默认参数 函数调用之后, 会影响到之后调用函数的结果。这是因为当默认参数值是可变对象的...

  • scanf函数

    scanf函数在接收字符串时就是这么安排的——遇到空格或回车就认为前面的输入已经完成且有效!

网友评论

      本文标题:调用scanf函数的一个陷阱

      本文链接:https://www.haomeiwen.com/subject/mnbzyqtx.html