使用sleep()时C中put()和printf()之间的差异

使用sleep()时C中put()和printf()之间的差异,c,sleep,puts,C,Sleep,Puts,在使用sleep()函数时,我想知道put()和printf()函数之间的区别 这是我的代码(C语言): 编译并运行程序后,它似乎会先睡眠,然后打印“你好,世界再见,再见!” 但是,如果使用put()而不是printf(),它将打印“hello,world”,然后休眠,最后打印“再见” 这是因为put还输出一个换行符,在可以确定为交互的设备上,默认情况下会导致刷新(对于标准输出)(a) 如果您的初始printf在末尾输出一个换行符,您应该会看到类似的效果: printf("hello, worl

在使用sleep()函数时,我想知道put()和printf()函数之间的区别

这是我的代码(C语言):

编译并运行程序后,它似乎会先睡眠,然后打印“你好,世界再见,再见!”

但是,如果使用put()而不是printf(),它将打印“hello,world”,然后休眠,最后打印“再见”


这是因为
put
还输出一个换行符,在可以确定为交互的设备上,默认情况下会导致刷新(对于标准输出)(a)

如果您的初始
printf
在末尾输出一个换行符,您应该会看到类似的效果:

printf("hello, world\n");
或者如果您
fflush(stdout)sleep()
之前执行code>

C11
的相关部分是
7.21.3文件
,章节
/7

在程序启动时,三个文本流是预定义的,不需要显式打开 -标准输入(用于读取常规输入),标准输出(用于写入 常规输出)和标准错误(用于写入诊断输出)。一如当初 打开时,标准错误流未完全缓冲;标准输入与标准 当且仅当可以确定流不引用时,输出流才被完全缓冲 连接到交互式设备

这可以追溯到C89/90 4.9.3文件的时代:

在程序启动时,三个文本流是预定义的,不需要显式打开——标准输入(用于读取常规输入)、标准输出(用于写入常规输出)和标准错误(用于写入诊断输出)。打开时,标准错误流未完全缓冲;当且仅当可以确定流不引用交互设备时,标准输入和标准输出流被完全缓冲


(a) 字体没那么简单。首先,这取决于实现,因为标准规定交互设备的构成取决于实现(指定了行为,但没有指定影响该行为的内容)


其次(根据),标准仅要求在标准输出完全缓冲时(当设备绝对不交互时)。对于交互设备,是无缓冲还是行缓冲是一个实现决定。

据我所知,如果出现换行符,printf将刷新流。 但是,我不是很确定。它可能取决于实施情况

您的睡眠时间刚好足够printf刷新流,printf不包含
\n


我建议您在需要时使用
fflush(stdout)刷新流然后你就可以完全避免睡眠了。

这是因为缓冲-默认情况下,标准输出缓冲到每一行
printf()
不包含换行符,因此不会刷新输出
put()
包含一个换行符,因此刷新输出

您可以通过添加换行符使
printf()
刷新:

printf("hello, world\n");
或者直接调用
fflush()

fflush(stdout);
有关缓冲的更多信息,请参阅手册页:


可靠的回答。如果你提到自C89以来,标准一直是这样的,我会给你+1,这将使你超越我的答案:)我绝对不会放弃一些廉价的代表。我只是碰巧硬盘上有c90。现在我可以回家告诉妻子,我的“永远不要扔掉任何东西”策略有好处——她不会为此感到高兴的:-)
printf("hello, world\n");
fflush(stdout);
The three types of buffering available are unbuffered, block buffered, and
   line buffered.  When an output stream is unbuffered, information appears on
   the destination file or terminal as soon as written; when it is block 
   buffered many characters are saved up and written as a block; when it 
   is line buffered characters are saved up until a newline is output or input
   is read from any stream attached to a terminal device (typically stdin).
   ....
   If a stream refers to a terminal (as stdout normally does) it is 
   line buffered. 
   ....
   The standard error stream stderr is always unbuffered by default.