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>
换行符后显示它们?对这种行为有更好的解释吗?
然后程序进入 printf 语句,将该输出存储在某种缓冲区中,然后循环回到第二个 scanf 并读取该部分,7
所有这些都进行到该10<enter>
部分,现在最后的 scanf 读取/存储11
,因为有一个换行符,程序决定不再需要从 读取input buffer
,现在将其余内容从 输出output buffer
到控制台。
是这样的还是这个类比有一些不准确的地方?
编辑#2:我发现这篇很好的博文解释了 's 和输入缓冲区的情况scanf
,以及 @dbush 和 @Weather Vane 的答案,完全回答了我对此的任何疑问
从终端读取数据时,在您按下 ENTER 之前不会发送任何内容scanf
。
所以在你的例子中,你有 6 个字符串,它们看起来像输入缓冲区中的数字。第一个只scanf
读取第一个数字,因为这就是它的模式正在寻找的数字,并将其余数字留在输入缓冲区中。然后程序继续调用printf
,并且由于字符串以换行符结尾,因此它会立即打印。当程序循环回到 时scanf
,输入缓冲区中已经有数据,因此它会读取其中的内容并立即返回,然后循环继续。
因此,只有第一个调用scanf
正在等待用户的输入,而其他调用正在读取输入缓冲区中已有的内容,并且调用printf
将其输出立即发送到终端,因为要打印的字符串以换行符结尾。