我得到了这段代码
#include<stdio.h>
#include <stdlib.h>
int main()
{
int i;
int number, S;
float MO;
S = 0;
for(i=0;i<10;i++)
{
printf("AAA %d\n", i );
scanf("%d\n", &number);
S = S + number;
}
MO = S/10;
printf("%d , %f \n",S , MO );
return 0;
}
当执行开始时,打印出AAA 0。然后我给出我的第一个号码。之后,我希望看到AAA 1,但只有在我给出第二个号码后才能打印。 在这里查看
C/C++ printf() before scanf() issue
但似乎我无法让这些解决方案适用于我
答案 0 :(得分:4)
声称这与刷新输入或输出有关的答案是错误的。问题与此无关。 \n
模板字符串末尾的scanf()
字符的外观指示scanf()
匹配并丢弃空白字符。它将执行此操作,直到遇到非空白字符或达到文件结尾。 C11标准的相关部分是§7.21.6.25:
由空白字符组成的指令由执行 读取输入到第一个非空白字符(仍然是 未读),或直到不再能读取任何字符。指令永远不会 失败。
在OP的情况下,必须在输入流中放置第二个数字,以便可以分配第一个数字。然后第二个数字保留在输入流中,直到下一次调用scanf()
。在Stephan Lechner给出的示例的情况下,从文件中获取输入,在每个要分配的数字之后输入流中有一个数字,直到最后一个数字(如果恰好有十个数字),然后是{{ 1}}导致EOF
返回。请注意,OP在每次输入后也可以从键盘发出scanf()
信号。或者,OP可以在一行中输入所有数字,并使用额外的数字来表示输入结束:
EOF
解决方案只是从1 2 3 4 5 6 7 8 9 10 11
模板字符串的末尾删除\n
。这种模板字符串末尾的空白字符很棘手,几乎从来没有实际需要的东西。
答案 1 :(得分:3)
只需从\n
格式字符串中删除scanf
:
scanf("%d", &number);
答案 2 :(得分:3)
"\n"
等待非空格。而是使用scanf("%d", &number)
@Michael Walz并检查其返回值。
让我们分解scanf("%d\n", &number);
"%d"
扫描数字文字。该说明符将允许前导空白区域。找到某个非数字字符后,将该字符放回stdin
。如果找到整数的有效数字文本,请转换为int
并保存到number
。
"\n"
扫描并丢弃0 或更多空格,例如'\n'
,' '
等。 继续扫描,直到遇到非空格,将该字符放回stdin
。
现在返回扫描的字段数(1)。
注意步骤2.用户必须在返回或'\n'
之后输入数据才能返回scanf()
。
答案 3 :(得分:0)
问题在于\n
的缓冲,除非fflush
在输出中或{{1}}被专门调用