调用scanf函数的一个陷阱
来源:互联网 发布:淘宝手机助手好用吗 编辑:程序博客网 时间:2024/06/15 22:46
我们在写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",¶1);printf("请输入运算符 '+ - * /'\n");scanf("%c",&ope);printf("请输入第二个运算参数\n");scanf("%d",¶2);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; }
此程序不管从语法,还是逻辑上,都没有问题,且编译也能通过。实际运行时,却是如下结果:
在用户输入第一个运算参数后,按照程序的设定,应该让用户输入运算符,可是直接让用户输入第二个运算参数了。你能看出这是为什么吗?
我们修改下程序,如下:
#include <stdio.h>int main(){char ope = '\0';//操作符+ - * /int para1 = 0, para2 = 0, result = 0;//para1是运算参数1,para2是运算参数2,result是运算结果printf("请输入第一个运算参数\n");scanf("%d",¶1);printf("请输入运算符 '+ - * /'\n");scanf("%c",&ope);printf("运算符是: %d\n", ope);printf("请输入第二个运算参数\n");scanf("%d",¶2);//加入这两行代码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码值,结果如下:
可以看到,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",¶1);getchar();printf("请输入运算符 '+ - * /'\n");scanf("%c",&ope);getchar();printf("运算符是: %d\n", ope);printf("请输入第二个运算参数\n");scanf("%d",¶2);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函数从输入流中读取一个字符,因此可以接收我们每次按下的回车键,也就是换行符。运行结果如下:
0 0
- 调用scanf函数的一个陷阱
- scanf使用的一个小陷阱
- scanf 函数的 用法 以及陷阱
- scanf的陷阱
- scanf() 一个神奇的函数
- gcc中使用scanf的一个小陷阱
- _read函数的一个陷阱
- 关于scanf()调用的一个例子
- scanf可能遇到的陷阱
- ios调用dismissViewController的一个小陷阱
- DB2 DATE 函数的使用一个陷阱
- scanf的输入字符时的陷阱
- scanf()函数如何输入一个带空格的字符串函数
- C语言不用scanf函数的一个简单的计算器
- 关于c++显示调用析构函数的陷阱
- 关于c++显示调用析构函数的陷阱
- 拷贝构造函数的特殊调用方式+陷阱
- scanf这个函数--论坛里的一个帖子
- 一个优雅的threadLocal工具类
- IOException while loading persisted sessions
- Android异常—捕获并保存到SD卡中
- Excel VBA Table Tools / DB facilities
- 常见机器学习算法比较
- 调用scanf函数的一个陷阱
- jQuery实现标签子元素的添加和赋值
- Linux TCP_DEFER_ACCEPT的作用
- C++ algorithm
- struts2 validation.xml 验证
- 视图容器ViewPager简单操作
- 安卓仿微信录音功能实现
- halcon与VS2013的配置
- android效果TapBarMenu绘制底部导航栏的使用方式