为什么在循环中使用scanf和printf会导致此输出

o4tp2gmn  于 2023-01-16  发布在  其他
关注(0)|答案(2)|浏览(150)

相关程序:第一名:

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的答案,完全回答了我对此的任何疑问

6vl6ewon

6vl6ewon1#

从终端阅读数据时,在按ENTER键之前,不会向scanf发送任何数据。
在本例中,输入缓冲区中有6个看起来像数字的字符串,第一个scanf只读取第一个数字,因为这是它的模式要寻找的,其余的留在输入缓冲区中,然后程序继续调用printf,因为字符串以换行符结尾,所以会立即打印出来,当程序循环回到scanf时,输入缓冲区中已经有数据,因此它读取其中的内容并立即返回,循环继续。
因此,只有对scanf的第一个调用在等待用户的输入,而其他调用则阅读输入缓冲区中已经存在的内容,并且printf调用的输出会立即转到终端,因为要打印的字符串以换行符结尾。

cld4siwp

cld4siwp2#

当程序运行第一个scanf(“%d”,&size);它从输入流中读取值5,并且该值用于定义数组“v”的大小。然后,循环开始运行,并且对于每一次迭代,它调用scanf(“%d”,&v[i]),scanf(“%d”,&v[i])从输入流中读取值,并且将该值赋给数组的第i个元素。
但是,它也调用printf(“第% d个元素是:%d\n”,i,v[i]),它打印数组第i个元素的值和迭代编号。
所以,在程序读取了填充数组所需的5个值之后,它又读取了一个值,这个值没有赋给任何变量,这就是为什么你会在输出中看到额外的值。

相关问题