Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C printf在扫描下一个数字之前不会打印_C_For Loop_Printf_Scanf - Fatal编程技术网

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
    与换行符匹配是一个常见的错误,但事实上,这与在格式字符串中添加空格没有什么不同。