2016-11-08 30 views
-1

编辑:我简化了原始代码。相同的代码,在不同的C编译器中使用printf()和write()不同的打印顺序

的代码是:

#include <stdio.h> 
#include <unistd.h> 

int  main(void) 
{ 

    printf("printf1\n"); 
    write(1, "1 should be after printf\n", 25); 

    printf("printf2\n"); 
    write(1, "2 should be after printf\n", 25); 

    return 0; 
} 

Ideone意外的结果:

1 should be after printf 
2 should be after printf 
printf1 
printf2 

cs50

printf1 
1 should be after printf 
printf2 
2 should be after printf 

预期的结果为什么是输出顺序不同?

+5

你不冲水printfs输出后的输出。当它被刷新时取决于操作系统。见[this](/ questions/1716296/why-does-printf-not-flush-after-call-unless-a-newline-is-the-format-strin) – Tibrogargan

+0

@Tibrogargan谢谢!你指向正确的方向。 – rldyjb

回答

0

这里的printf等待缓冲区已满而写入不这样做。如果你在printf的最后有一个\ n(换行符),那么只要遇到\ n,它就会调用写入。请注意,一旦缓冲区已满,打印也会调用写入。写入只会将给定的字节数输出到终端,因此会更快。

尝试你的代码为:

printf("i = %d\n", i); 
ft_putstr("should be printed right after printf\n"); 
+0

我试着将代码添加到printf中,但是ft_putstr()的内容仍然在printf()之前。你可以在http://ideone.com/zGacCM上看到结果 – rldyjb

+0

我在本地机器上试过了。它按预期工作。谢谢! – rldyjb

+0

printf(“i =%d \ n”,i); fflush(stdout); ft_putstr(“应该在printf \ n之后立即打印)”;这也将工作正常。只需刷新缓冲区。 –

相关问题