【问题标题】:Why does having scanf & printf in a loop cause this output为什么循环中有 scanf 和 printf 会导致此输出
【发布时间】:2023-01-15 00:22:31
【问题描述】:

有问题的程序:#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;
}

开/关:

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

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

那么程序是否会在您按&lt;Enter&gt;换行后“保留”打印语句以显示它们?在某处对这种行为有更好的解释吗?

【问题讨论】:

    标签: c loops printf scanf


    【解决方案1】:

    从终端读取时,scanf 在您按 ENTER 之前不会返回。

    所以在你的例子中,你有 6 个字符串,它们看起来像输入缓冲区中的数字。第一个 scanf 只读取第一个数字,因为这是它的模式正在寻找的,并将其余部分留在输入缓冲区中。然后在下一次调用 scanf 时,输入缓冲区中已经有数据,因此它读取那里的内容并立即返回。

    因此,只有对scanf 的第一个调用在等待用户输入,而其他调用则在读取输入缓冲区中已有的内容。

    【讨论】:

    • 我会说这是一个带有一个数字的字符串,然后是&lt;enter&gt;,然后是scanf()读取数字,然后是另一个字符串其中的数字,然后是&lt;enter&gt;,然后循环运行。在这种情况下,IMO 更接近程序读取的内容。
    【解决方案2】:

    printf 数据在缓冲区中。当遇到新行或程序结束时,这将被刷新到控制台。

    要解决此问题,请在 printf 之后添加 fflush(stdout)

    【讨论】:

    • 此处提供的信息在技术上是正确的,但不适用于相关程序所显示的行为。
    猜你喜欢
    • 2023-03-24
    • 2012-09-27
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多