c语言为什么连续的printf和scanf时scanf会被跳过

为什么连续的printf和scanf时scanf会被跳过
首先举两个栗子吧:
For example:

#include<stdio.h>
int main()
{
    char a,b;
    printf("Please enter a letter:\n");
    scanf("%c",&a);
    printf("Please enter a letter:\n");
    scanf("%c",&b);
    printf("%c\t%c",a,b);
}

输出结果:
在这里插入图片描述
那么问题来了:第二个字符还没输入,就已经输出最终结果了,也就是说第二个scanf貌似被直接忽略了。
For example again:

#include<stdio.h>
int main()
{
double f,m,i;
char a,b,c;
printf("男性(M),女性(F):");
scanf("%c",&a);/*1号*/
printf("父亲身高(cm):");
scanf("%lf",&f);/*2号*/
printf("母亲身高(cm):");
scanf("%lf",&m);/*3号*/
if(a=='M') i=(f+m)*0.54;
else
i=(f*0.923+m)/2;
printf("是否喜欢运动(p/q):");
scanf("%c",&c);/*4号*/
if(c=='p')
i=i+i*0.02;
else i=i;
printf("是不是有良好饮食(x/y):");
scanf("%c",&b);/*5号*/
if(b=='x') i=i+i*0.015;
else i=i;

printf("预测自己的身高%.2lf(cm)",i);
return 0;
}

运行结果:
在这里插入图片描述
同样的问题,我们可以看到,3号输入结束后,直接略过4号输入,蹦到了5号输入,自然得到的结果就是错误的。
解决方法:在4号和5号的%c前面加一个空格(\n也是可以的),如下:

scanf(" %c",&c);//4号
scanf("\n%c",&b);//5号

运行结果终于正确了:
在这里插入图片描述
那么原因是什么呢?
我们在将3号输入完之后,肯定会打一个回车键’\n’,而4号读取的时候就会认为你所打的回车键是4号所输入的值,那么他默认4号输入完成(其实你还什么都没输入),就到了5号输入。我们若在%c前加一个空格或’\n’那么刚才被默认的字符’\n’就会被赋给%c前所加的空格或’\n’啦,而你真正想输入的字符就会物归原主被赋给c啦!
那么为什么只在4号和5号中加空格呢?
我们知道1号作为第一个输入,并不受什么影响;而2号和3号之所以也不受影响,是因为1号输入完打的回车键\n是字符,而2号所需要输入的是一个双精度浮点数,自然就不将回车键’\n’默认为输入的数据了。
补充:
还有一种解决方法:在4号和5号语句前加上fflush (stdin);或者说在3号和4号后面加上fflush (stdin);只是表述不一样,其实结果是一样的。代码如下:

fflush (stdin);
scanf("%c",&c);
fflush (stdin);
scanf("%c",&b);

原因应该也同上。
如有不足,还望大神指点指点。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值