为什么在循环中使用 scanf 和 printf 会导致此输出

3rd*_*out 2 c printf loops scanf

有问题的程序: #1:

int main(void) {
  int size;
  scanf("%d", &size);
  int v[size];
  for(int i = 0; i < size; ++i) {
      scanf("%d", &v[i]);
      printf("the %d-th element is : %d\n",i, v[i]);
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

5
6 7 8 9 10 11
the 0-th element is : 6
the 1-th element is : 7
the 2-th element is : 8
the 3-th element is : 9
the 4-th element is : 10
Run Code Online (Sandbox Code Playgroud)

我的问题: 为什么程序似乎在您输入后执行了所有打印语句?

那么程序是否会“保留”打印语句以在您按下<Enter>换行符后显示它们?对这种行为有更好的解释吗?

**在@dbush的回答后编辑**我需要对此进行一些澄清:所以假设`size = 5`并且我的输入是`6 7 8 9 10`所以我假设第一个`scanf`循环读取“6”部分,然后读取/存储数据,然后将输入缓冲区中的其余内容传递到下一个“scanf”,将其余输入数据留在“输入缓冲区”中

然后程序进入 printf 语句,将该输出存储在某种缓冲区中,然后循环回到第二个 scanf 并读取该部分,7 所有这些都进行到该10<enter>部分,现在最后的 scanf 读取/存储11,因为有一个换行符,程序决定不再需要从 读取input buffer,现在将其余内容从 输出output buffer到控制台。

是这样的还是这个类比有一些不准确的地方?

编辑#2:我发现这篇很好的博文解释了 's 和输入缓冲区的情况scanf,以及 @dbush 和 @Weather Vane 的答案,完全回答了我对此的任何疑问

dbu*_*ush 6

从终端读取数据时,在您按下 ENTER 之前不会发送任何内容scanf

所以在你的例子中,你有 6 个字符串,它们看起来像输入缓冲区中的数字。第一个只scanf读取第一个数字,因为这就是它的模式正在寻找的数字,并将其余数字留在输入缓冲区中。然后程序继续调用printf,并且由于字符串以换行符结尾,因此它会立即打印。当程序循环回到 时scanf,输入缓冲区中已经有数据,因此它会读取其中的内容并立即返回,然后循环继续。

因此,只有第一个调用scanf正在等待用户的输入,而其他调用正在读取输入缓冲区中已有的内容,并且调用printf将其输出立即发送到终端,因为要打印的字符串以换行符结尾。