为什么" printf"不行?

时间:2016-08-27 11:31:16

标签: c printf

我正在#include <stdio.h> int main (void) { char a[]="abcde"; printf ("%s", a); } 学习编程。你能解释为什么没有在这里打印出来吗?提前谢谢。

{{1}}

3 个答案:

答案 0 :(得分:9)

在许多系统上printf被缓冲,即当您调用printf时,输出被放置在缓冲区中而不是立即打印。打印换行符\n时,将刷新缓冲区(也就是打印输出)。

在所有系统上,程序将打印,尽管缺少\n,因为在程序结束时刷新缓冲区。

通常,您仍会添加\n,如:

printf ("%s\n", a);

立即获取输出的另一种方法是调用fflush来刷新缓冲区。从手册页:

  

对于输出流,fflush()强制写入所有用户空间          通过流缓冲给定输出或更新流的数据          底层写功能。

来源:http://man7.org/linux/man-pages/man3/fflush.3.html

修改

正如@Barmar指出并引用@Alter Mann所要求的是,当程序结束时刷新缓冲区。

引自@Alter Mann:

  

如果main函数返回其原始调用者,或者调用了exit函数,则在程序终止之前关闭所有打开的文件(因此刷新所有输出流)。

请参阅calling main() in main() in c

答案 1 :(得分:0)

希望我可以就此提出几点意见 令人困惑。 Printf不是正在缓冲的东西,它是stdio,所以 所有类似的功能都将以相同的方式运行。 为了演示缓冲,您要做的就是 printf有很多字符,通常超过1024个, 和printf将打印,因为您将超出 最大缓冲区长度,它将自动刷新。 当然,所有其他观点也是正确和有效的。

答案 2 :(得分:-1)

如果您还需要打开fflush()以外的其他流来进行写操作,例如将文件输出到磁盘,那么执行stdout可能会很昂贵。运行fflush()将刷新所有流,而不仅仅是stdout。最好是更具体一些,然后将流传递给冲洗。因此,对于输出到stdout的printf(),您将使用fflush(stdout)。如果您要输出错误,则可以选择使用stderr,因为它没有fprintf()的缓冲。

还可以在写入之前使用setvbuf来更改打开的流缓冲区。参见man setvbuf