C printf在扫描下一个数字之前不会打印
我得到了这段代码C printf在扫描下一个数字之前不会打印,c,for-loop,printf,scanf,C,For Loop,Printf,Scanf,我得到了这段代码 #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;
#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;
}
#包括
#包括
int main()
{
int i;
整数,S;
浮钼;
S=0;
对于(i=0;i而言,问题在于stdout
的缓冲,除非\n
在输出中,或者专门调用fflush
,否则它不会强制刷新\n
只需从scanf
格式字符串中删除\n
:
scanf("%d", &number);
“\n”
等待非空白。改为使用scanf(“%d”,&number)
并检查其返回值
让我们将scanf(“%d\n”、&number)分解为scanf;
%d”
扫描数字文本。此说明符将允许前导空格。一旦找到某个非数字字符,请将该字符放回标准文本中。如果找到整数的有效数字文本,请将其转换为int
并保存到数字中
“\n”
扫描并丢弃0或更多的空格,如“\n”
、”
,以及其他空格。继续扫描直到遇到非空格,将该字符放回stdin
现在返回扫描的字段数(1)
注意第2步。用户必须在返回或'\n'
后键入数据才能返回scanf()
。声称这与刷新输入或输出有关的答案是错误的。问题与此无关。\n
字符出现在scanf()末尾
模板字符串指示scanf()
匹配并丢弃空白字符。它将这样做,直到遇到非空白字符或达到文件结尾。C11标准的相关部分是§7.21.6.2 5:
由空格字符组成的指令由
读取输入直到第一个非空白字符(保留
未读),或直到无法读取更多字符。该指令永远不会
失败了
在OP的情况下,必须在输入流中放置第二个号码,以便分配第一个号码。然后,第二个号码将保留在输入流中,直到下一次调用scanf()
。在Stephan Lechner给出的示例中,从文件中获取输入,在每个要分配的数字之后的输入流中都有一个数字,直到最后一个数字(如果正好有十个数字),然后EOF
导致scanf()
返回。请注意,OP也可以在每次输入后从键盘发出EOF
信号。或者,OP可以在一行上输入所有数字,并在输入结束时附加一个数字:
1 2 3 4 5 6 7 8 9 10 11
解决方案只是从scanf()
模板字符串的末尾删除\n
。这样一个模板字符串末尾的空白字符很棘手,而且几乎从来都不是实际需要的字符。scanf(“%d\n”,&number);
->scanf(“%d”,&number);
这确实解决了问题。但我不知道如何选择此注释作为答案。@MichaelWalz,您可以添加此作为答案。printf
s都有一个\n
。OP的问题与stdout
的缓冲无关。在这种情况下,问题是操作系统的缓冲,即答案的fflush部分问题是scanf
中的\n
。问题与操作系统缓冲或stdout
或fflush
无关。为什么必须这样做?如果他在数字后按Return,这与格式字符串不匹配吗?@Barmar否,\n
将匹配数字后的任何空格量。因此它可以匹配一个换行符或一百个换行符(以及任意数量的空格或制表符)。在看到至少一个非空白字符之前,scanf
不会返回。在键入非空白字符并按enter键之前,它也不会看到该非空白字符。答案中应该对此进行解释。几周前,我回答了一个类似的问题,关于scanf()中的空格
:我没有意识到\n
的作用是相同的。@Barmar是的,很容易错过,但手册页中有一个小注释说,“格式字符串中的空白(如空格、制表符或换行符)与输入中的任何空白匹配,包括无空白。”因此,期望格式中的\n
与换行符匹配是一个常见的错误,但事实上,这与在格式字符串中添加空格没有什么不同。