相关程序: #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>
后“保留”打印语句以显示它们新线?在某处是否对这种行为有更好的解释?
然后程序进入 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/