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格式串中不表示等待换行符,而是读取并放弃连续的空白字符;也就是说第三个字符输入时的回车被放弃掉了,直到下一个非空白字符才会匹配到第三个字符;

编写c语言中,为甚么要多输入一个数程序才往下执行
这里\\n是作为数据域,所以必须在遇到__第二个__\\n时scanf才结束。也就是说,你必须多输入一个回车才能使scanf结束。至于输出为什么又是正确的,那是scanf并不负责清理输入缓冲区,即不清理多余的输入,多余的输入可以作为下次的输入,包括\\n!故你可以得到正确输入。正确方法如下:scanf("%10d%10f",...

c语言中两个scanf为什么会出毛病?
那是因为在我们做了第一次输入时,并按下回车,使程序继续执行。而那个回车也随之进入了流当中。而遇到第二个scanf()时,scanf()把回车当作是第二次输入的字符而接收。因此程序也就忽略了输入而继续执行了。这个回车就是在做输入时产生的垃圾字符了。我第一次遇到它时,是我在写循环时遇到的,由于...

C语言中用scanf("%c",&ch);程序会出错,如果scanf(" %c",&ch);在%c...
清空输入缓冲区。如果经常出现情况这种的话,第一次输入的回车可能会被第二次输入操作所捕捉,这个的作用就是清空缓冲,这样就不会出现这种情况了。控制串中的空白符使 scanf() 在输入流中跳过一个或多个空白行。空白符可以是空格(space)、制表符(tab)和新行符(newline)。 本质上,控制串中的空白...

c语言 为什么循环的时候输入多了一次
scanf的输入格式不要添加不必要的符号,默认空格分割,如果你自己添加了字符,比如图中最后多出来的空格,那么你输入的时候,也必须按照这个格式输入。所以,想普通的输入,就把那个空格删了。还有,在C语言中,变量用于循环累加,变量定义时应该给个初值0。

C语言scanf()返回值,为什么我输入非数字会死循环,不是又提醒再一次输入...
逻辑控制有误。scanf返回正确接收数据的个数,出错时返回负数。你输入一个非数字m就是0。而m==0使while无限循环——因为那个非数字符号在输入缓冲区里未被取走,所以while中的scanf碰到它又使m==0……

...的输入6个数字进入数组 但是为什么要多输入一个数才能继续运行?_百度...
scanf里面,%d后面那个空格删掉就好了 你最好输入后面没有加空格,所以scanf没法识别了 对于空白字符,%d的时候,scanf可以自动忽略的,不要加到格式字符串里面

C语言输出值为什么有多出来一个重复的,看看是哪里出错了
在最后一个“}”的前面加入一个scanf("%c",&score);就可以了,它把多余的一个回车符读走。

c语言中多出一个输入值是怎么回事
= =虽然不知道你这东西是干什么的。但是感觉你的输入方式有问题。用空格有点那啥。。你可以试试,输入一个数后按回车。然后再输入另一个数。

在C语言中scanf("%d\\n",&a);这个语句,加上\\n 为什么在键盘输入的时候...
scanf(" "), scanf("\\n")效果是相同的:表明scan函数会读取空格、TAB、回车直到第一个非空字符为止。详细可以参见scanf()函数format字符串的详细解释。format C string that contains one or more of the following items:Whitespace character: the function will read and ignore any whitespace ...

...2010写C语言scanf输入多项值就会出错!输完第一个回车便报错。_百度...
后面跟着又scanf( "%c ",&people);时,系统将你的输入num后的回车(或空格)赋给了people。因此程序不能正确执行。当你用%s输入时,系统是将空格或回车解释为前一项结束,后一项开始,因此可以正确执行程序。要解决这个问题,你可将字符的输入换成:people=getche();lab=getche();应能解决。

相似回答