二维码
微世推网

扫一扫关注

当前位置: 首页 » 快报资讯 » 今日快报 » 正文

C语言编程误用scanf函数带来的一个诡异问题

放大字体  缩小字体 发布日期:2021-12-14 11:08:25    作者:田森    浏览次数:324
导读

感谢为来自互联网,在头条非首次,欢迎转发感谢,也欢迎留言讨论!我们在C语言编程程序时,会经常使用scanf函数,让用户输入一些数据,如果对scanf函数理解不深,那可是会出现一些很奇怪得问题,感谢就谈谈其中一个问题。下面得C语言程序是一个简单得四则运算程序:#include stdio.hint main(){char ope = '\0';//

感谢为来自互联网,在头条非首次,欢迎转发感谢,也欢迎留言讨论!

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

#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;

}

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

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

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

#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;

}

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

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

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

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

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

 
(文/田森)
免责声明
• 
本文仅代表发布者:田森个人观点,本站未对其内容进行核实,请读者仅做参考,如若文中涉及有违公德、触犯法律的内容,一经发现,立即删除,需自行承担相应责任。涉及到版权或其他问题,请及时联系我们删除处理邮件:weilaitui@qq.com。
 

Copyright©2015-2025 粤公网安备 44030702000869号

粤ICP备16078936号

微信

关注
微信

微信二维码

WAP二维码

客服

联系
客服

联系客服:

24在线QQ: 770665880

客服电话: 020-82301567

E_mail邮箱: weilaitui@qq.com

微信公众号: weishitui

韩瑞 小英 张泽

工作时间:

周一至周五: 08:00 - 24:00

反馈

用户
反馈