为什么连续的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);
原因应该也同上。
如有不足,还望大神指点指点。