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

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

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

首先举两个栗子吧:

For example:

#include

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

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

原因应该也同上。

如有不足,还望大神指点指点。