C语言 管道缓冲无法正常工作的原因

a64a0gku  于 2023-04-29  发布在  其他
关注(0)|答案(1)|浏览(103)

https://cpp.sh/上运行这段代码时,我遇到了一些真正让我恼火的问题。

// taken from here https://cplusplus.com/reference/cstdlib/atoi/
#include <stdio.h>      /* printf, fgets */
#include <stdlib.h>     /* atoi */

int main ()
{
  //* setbuf(stdout, NULL);
  int i;
  char buffer[256];
  printf ("Enter a number: ");
  fgets (buffer, 256, stdin);
  i = atoi (buffer);
  printf ("The value entered is %d. Its double is %d.\n",i,i*2);
  return 0;
}

它显示下一个输出(输入“10\n”作为输入):

10 
Enter a number: The value entered is 10. Its double is 20.

我熟悉linux管道和缓冲的概念,我知道pip在监听输入之前刷新stdout的内容,所以我想知道为什么fgets在等待输入之前不刷新stdout。
当从带有 * 的行中删除注解时,它会按预期工作,并且在编译和运行gcc(Ubuntu 11.3.0-1ubuntu1~22。04)11.3.0也可以工作,所以我不明白当我在在线c++编译器上运行它时发生了什么?

yqhsw0fo

yqhsw0fo1#

默认情况下,stdout是完全缓冲的,除非它连接到一个终端;在这种情况下,它是行缓冲的。直到输出缓冲区填满(可能是4K字节),才会打印提示符。
您可以调用fflush(stdout)来强制将缓冲区写入管道。

printf ("Enter a number: ");
  fflush(stdout);
  fgets (buffer, sizeof buffer, stdin);

相关问题