使用sleep()时,C中的puts()和printf()之间的区别

时间:2013-02-04 04:10:44

标签: c sleep puts

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

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

printf("hello, world");
sleep(1);
printf("Good, bye!");

编译并运行程序后,似乎先睡觉然后打印“hello,worldGood,bye!”

但是,如果使用puts()而不是printf(),它将打印“hello,world”然后睡眠,最后打印“Good,bye”。

puts("hello, world");
sleep(1);
puts("Good, bye!);

3 个答案:

答案 0 :(得分:9)

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

如果您的初始printf在最后输出换行符,您应该会看到类似的效果:

printf("hello, world\n");

fflush (stdout);来电前sleep()

C11的相关部分为7.21.3 Files/7部分:

  

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

这可以追溯到C89/90 4.9.3 Files

的日子
  

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


(a):这不是相当那么简单。首先,这是依赖于实现的,因为标准规定构成交互设备的内容是依赖于实现的(指定行为但不影响该行为)。

其次(根据here),标准仅在标准输出变为完全缓冲区时(当设备绝对不是交互式时)。无论是无缓冲还是线路缓冲的交互式设备都是一项实施决策。

答案 1 :(得分:7)

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

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

printf("hello, world\n");

或直接致电fflush()

fflush(stdout);

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

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.

答案 2 :(得分:0)

根据我的理解,如果存在换行符\n,printf将刷新流。 放,我不太确定。它可能与实现有关。

您的睡眠时间足够长,因为printf不包含\n来刷新流。

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