我正在#include <stdio.h>
int main (void)
{
char a[]="abcde";
printf ("%s", a);
}
学习编程。你能解释为什么没有在这里打印出来吗?提前谢谢。
{{1}}
答案 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函数,则在程序终止之前关闭所有打开的文件(因此刷新所有输出流)。
答案 1 :(得分:0)
希望我可以就此提出几点意见 令人困惑。 Printf不是正在缓冲的东西,它是stdio,所以 所有类似的功能都将以相同的方式运行。 为了演示缓冲,您要做的就是 printf有很多字符,通常超过1024个, 和printf将打印,因为您将超出 最大缓冲区长度,它将自动刷新。 当然,所有其他观点也是正确和有效的。
答案 2 :(得分:-1)
如果您还需要打开fflush()
以外的其他流来进行写操作,例如将文件输出到磁盘,那么执行stdout
可能会很昂贵。运行fflush()
将刷新所有流,而不仅仅是stdout。最好是更具体一些,然后将流传递给冲洗。因此,对于输出到stdout
的printf(),您将使用fflush(stdout)
。如果您要输出错误,则可以选择使用stderr
,因为它没有fprintf()
的缓冲。
还可以在写入之前使用setvbuf
来更改打开的流缓冲区。参见man setvbuf