C printf在扫描下一个号码之前不会打印

时间:2017-01-26 21:08:34

标签: 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;

  printf("%d , %f \n",S , MO );
  return 0;
}

当执行开始时,打印出AAA 0。然后我给出我的第一个号码。之后,我希望看到AAA 1,但只有在我给出第二个号码后才能打印。 在这里查看

C/C++ printf() before scanf() issue

但似乎我无法让这些解决方案适用于我

4 个答案:

答案 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);

  1. "%d"扫描数字文字。该说明符将允许前导空白区域。找到某个非数字字符后,将该字符放回stdin。如果找到整数的有效数字文本,请转换为int并保存到number

  2. "\n"扫描并丢弃0 或更多空格,例如'\n'' '等。 继续扫描,直到遇到非空格,将该字符放回stdin

  3. 现在返回扫描的字段数(1)。

    注意步骤2.用户必须在返回'\n'之后输入数据才能返回scanf()

答案 3 :(得分:0)

问题在于\n的缓冲,除非fflush在输出中或{{1}}被专门调用

,否则不会强制刷新