C语言编程误用scanf函数带来的一个诡异问题,你会不会觉得很神奇!

我们在C语言编程程序时,会经常使用scanf函数,让用户输入一些数据,如果对scanf函数理解不深,那可是会出现一些很奇怪的问题,本文就谈谈其中一个问题。下面的C语言程序是一个简单的四则运算程序:

#include

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;

}

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

在用户输入第一个运算参数1后,会按下回车键,准备输入运算符,可是从运行结果来看,C程序跳过让用户输入运算符的步骤,直接让用户输入第二个运算参数了。你能看出这是为什么吗? 在输入运算符那里发生什么了?

分享之前我还是要推荐下我自己建的C/C++开发学习群:【二四八,八九四,四三零】,都是学C/C++开发的,如果你正在学习C/C++ ,小编欢迎你加入,今天分享的这个案例已经上传到群文件,大家都是软件开发党,不定期分享干货(只有C/C++软件开发相关的),包括我自己整理的一份2018最新的C/C++零基础资料和C/C++进阶教程,欢迎进加入前面我写过一篇文章谈了自己的C/C++学习经验(我学C/C++的经验),里面谈到"技巧宛如一颗一颗珍珠",后台有好几个小伙伴留言,能不能分享一些技巧. 其实我的企鹅号里面多多少少分享过一些,今天我分享一些自己私藏的非常不错的技巧和代码给大家,希望对大家有用!

C/C++游戏编程比较系统的学习路线

c语言入门 程序设计-算法-运算符-顺序 分支 循环结构。C语言精通 数组-函数字串符

-指针-构造类型-预处理-存储管理-文件操作-数据结构。c++入门 面对对象编程-类和对象-运算符重载

-派生于继承,异常处理技术-C++语言 11标准-数据结构-(双向链表-双向队列-树-图)。c++精通

stl标准模板库(容器-迭代器-算法)正则表达式-boost标准模板库-socket网络编程-大型企业项目实战:

-员工信息管理系统-推箱子-俄罗斯方块-服务器-播放器-人工智能。windows高级工程师:win32/mfc

-windows高级编程-QT框架编程-大型企业级项目实战项目(人脸识别-车牌识别-局域网远程监控-等项目)

linux系统应用程序开发-linux内核构架研究-linux顶级网络服务器开发及搭建。大型企业项目实战

(linux内核高级虚拟内存驱动设计-linux网络间谍系统软件-linux内核网络数据劫持-linux网络阅读系统开发

等等)上述学习6个月时间左右,如果一天高效率用6个小时学习,加油奋吧,骚年们!

我们在C语言程序准备输入运算符时,加入一句打印:printf("运算符是: %d\n", ope);,如下黑体所示,看看到底是什么原因:

#include

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;

}

我们加入代码printf("运算符是: %d\n", ope);,输出字符参数ope的ASCII码值,结果如下:

可以看到,ope的ASCII码值是10,这正是“换行符”的ASCII码值。我们什么时候把换行符给了ope?

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

知道了问题所在,那么就好解决了,为了不让回车键捣乱我们的C程序,可以使用getchar()函数来接收回车符, C程序修改的地方用黑体标记出来:

#include

#include

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函数从输入流中读取一个字符,因此可以接收我们每次按下的回车键,也就是换行符。修改后的C程序运行结果如下:

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180201A1372Z00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励