c语言中scanf为什么不变黑体,C语言编程误用scanf函数带来的一个诡异问题

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语言程序不管从语法还是逻辑上,都没有问题,且编译也能通过。实际运行时,却是如下结果:

91861154_1

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

我们在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码值,结果如下:

91861154_2

可以看到,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程序运行结果如下:

91861154_3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值