c语言scanf首次执行时会多输入一个值,之后就正常了,为什么会有这个BUG?

如以下语句:
#include "stdio.h"
void main()
{
int a,b,c,i;
for(i=0;i<100;i++)
{
scanf("%d\n",&a);
scanf("%d\n",&b);
scanf("%d\n",&c);
printf("a is %d\n",a);
printf("b is %d\n",b);
printf("c is %d\n",c);

}
正常的状况应该是你先输入三个数,之后电脑再把你输的三个数输出,重复一百次。
可在我电脑生的执行情况却是,第一次循环执行时要你输入四个值程序才向下运行,第一次输出了我输入的前三个数。循环第二次执行时输入值的个数就正常了,是三个,可输出的a,b,c分别是我第一次输入的那第四个数和第二次输入的前两个。以此类推,因为第一次循环时莫名其妙的多执行了一次输入语句,向下的赋值全部被打乱了。

看不懂的话我举个例子吧:
程序开始执行后我输入了1,2,3三个数,可他并没有什么反应,于是我又输入了4,然后就有反应了,显示了a is 1
b is 2
c is 3
三行输出结果。然后进入了第二次循环。我又输入了三个数,5,6,7,这次有反应,但输出的是:a is 4
b is 5
c is 6
而不是我输入的5 6 7
之后进入第三次循环,我输入8,9,10,同样可以向下进行,但输出的是
a is 7
b is 8
c is 9
以此类推。第一次多输入了一个值,之后这个值向下顺延,把其后的每个值都向下推了一步。
请问为啥会这样啊?
我试了一上午,用了各种简单的小程序,不是光循环,在我电脑上只要是scanf语句都成这样了,一定会多出一个值来。我本想趁放假学点简单的编程,结果就这样scanf语句直接瘫痪了。我现在寸步难行啊。求大神指教。
试过fflush(stdin);语句,如果每次执行完scanf后都清除输入缓存的话下次执行就还是会多让你输入一个值。总之就是感觉他非要你实际输入的数值个数比理论上多一个不可。

    scanf中\n问题
    scanf("%d\n",&num);
    scanf函数的第一个参数指定了后面变量读取的格式,这样写的话会按照 :
    数字 回车
    的格式读取,读到回车之后会继续读下一行,如果缓冲区没有东西scanf就会阻塞在那里,直到用户有输入以至于有时候会遇到再输入一行才能有返回的情况。

    我觉得你可以去了解下scanf()函数的用法和原理:你的程序执行到scanf()时,会从你的缓冲区读东西,如果缓冲区是空的,就阻塞住,等待你从键盘输入。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-06-16
你把scanf语句中的\n去掉就好了。
\n在scanf格式串中不表示等待换行符,而是读取并放弃连续的空白字符;也就是说第三个字符输入时的回车被放弃掉了,直到下一个非空白字符才会匹配到第三个字符;
相似回答