c - 为什么循环中有 scanf 和 printf 会导致此输出

标签 c loops printf 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;
}

O/P:

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

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

程序也会在您按下 <Enter> 后“保留”打印语句以显示它们新线?在某处是否对这种行为有更好的解释?

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

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

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

编辑 #2: 我找到了这个 good blogpost解释 scanf 发生了什么的和输入缓冲区,连同@dbush 和@Weather Vane 的回答完全回答了我对此的任何疑问

最佳答案

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

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

所以只有第一次调用 scanf 等待用户输入,而其他调用正在读取输入缓冲区中已有的内容,而 printf 调用正在等待用户输入由于要打印的字符串以换行符结尾,因此它们的输出会立即转到终端。

关于c - 为什么循环中有 scanf 和 printf 会导致此输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75119245/

相关文章:

c++ - 是否有 C++ 标准库包装器或 pthread_sigmask 的替代品?

c - 如何将字符串输入到使用 malloc 分配的 char* 变量中?

c - 两种数组指针初始化方法的区别

c++ - 循环遍历 Lua 表格中的表格

c - 从 printf 输出中提取 float ,其格式为 %d

c - 如何打印字符*

c - fscanf 两行数据,执行计算,打印结果,fscanf 接下来的两行,在一个循环中?

c - 将 char 数组传递给函数并将内容复制到另一个 char 数组

python - python 中的整数比较会使一切变慢

arrays - 将哈希压入数组 : last Hash overwriting previous array elements