在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++编译器上运行它时发生了什么?
1条答案
按热度按时间yqhsw0fo1#
默认情况下,
stdout
是完全缓冲的,除非它连接到一个终端;在这种情况下,它是行缓冲的。直到输出缓冲区填满(可能是4K字节),才会打印提示符。您可以调用
fflush(stdout)
来强制将缓冲区写入管道。