相关程序:第一名:
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>
键换行之后,“保留”了print语句并显示出来呢?对于这种行为,有没有更好的解释?
在@dbush的回答之后编辑我需要澄清一下:假设'size = 5',我的输入是'678910',所以我假设循环中的第一个'scanf'读取'6'部分,然后读取/存储数据,然后将输入缓冲区中的其余内容传递到下一个'scanf',将输入数据的其余部分留在'input buffer'中
然后程序执行printf语句,将输出存储在某种缓冲区中,然后循环回第二个scanf,读取7
部分,所有这些操作一直进行到10<enter>
部分,现在最后一个scanf读取/存储11
,由于有一个换行符,程序决定它不再需要从X1 M4 N1 X读取,并且现在将来自X1 M5 N1 X的剩余内容输出到控制台。
是这样的吗?还是这个类比有一些不准确的地方?
**编辑#2:**我发现这个good blogpost解释了scanf
和输入缓冲区的情况,连同@dbush和@Weather Vane的答案,完全回答了我对此的任何疑问
2条答案
按热度按时间6vl6ewon1#
从终端阅读数据时,在按ENTER键之前,不会向
scanf
发送任何数据。在本例中,输入缓冲区中有6个看起来像数字的字符串,第一个
scanf
只读取第一个数字,因为这是它的模式要寻找的,其余的留在输入缓冲区中,然后程序继续调用printf
,因为字符串以换行符结尾,所以会立即打印出来,当程序循环回到scanf
时,输入缓冲区中已经有数据,因此它读取其中的内容并立即返回,循环继续。因此,只有对
scanf
的第一个调用在等待用户的输入,而其他调用则阅读输入缓冲区中已经存在的内容,并且printf
调用的输出会立即转到终端,因为要打印的字符串以换行符结尾。cld4siwp2#
当程序运行第一个scanf(“%d”,&size);它从输入流中读取值5,并且该值用于定义数组“v”的大小。然后,循环开始运行,并且对于每一次迭代,它调用scanf(“%d”,&v[i]),scanf(“%d”,&v[i])从输入流中读取值,并且将该值赋给数组的第i个元素。
但是,它也调用printf(“第% d个元素是:%d\n”,i,v[i]),它打印数组第i个元素的值和迭代编号。
所以,在程序读取了填充数组所需的5个值之后,它又读取了一个值,这个值没有赋给任何变量,这就是为什么你会在输出中看到额外的值。