为什么 "printf" 没有输出任何内容?

23
我正在学习编程语言C, 你能解释一下为什么这里没有打印任何东西吗?
我在学习编程语言C,请问为什么这里没有输出任何内容?
#include <stdio.h>

int main (void)
{
    char a[]="abcde";
    printf ("%s", a);
}

2
将字符串或格式添加“\n”。-->> printf ("%s\n", a); - wildplasser
2
为什么它不会打印? - machine_1
2
你需要从你的函数返回一个整数。 - samgak
10
由于你没有在输出末尾添加换行符,可能会导致输出内容与你的Shell提示混杂在一起,不太容易看清楚。请注意添加换行符。 - Barmar
4
可能它会起作用,但在提示之前你没有查看字符串。类似于 abcdeC:\Windows>abcdeuser@host:~$ - i486
显示剩余5条评论
3个回答

54

在许多系统上,printf 是有缓存的,也就是说,当您调用 printf 时,输出会被放置在缓冲区中而不是立即打印。只有在您打印一个换行符 \n 时,缓冲区才会被清空(即输出被打印)。

在所有系统上,即使缺少 \n,您的程序仍将打印,因为当您的程序结束时缓冲区会被刷新。

通常情况下,您仍然应该添加 \n,例如:

printf ("%s\n", a);
调用 fflush 函数可以立即获取输出结果。从 man 手册中可以得知:对于输出流,fflush() 函数通过流的底层写函数强制写入给定输出或更新流的所有用户空间缓冲数据。参考链接:http://man7.org/linux/man-pages/man3/fflush.3.html。需要注意的是,当程序结束时必须刷新缓冲区。详情请参见 calling main() in main() in c

8
C系统在程序结束时必须刷新输出。 - Barmar
1
@Barmar,说得好:如果主函数返回到其原始调用者,或者调用了exit函数,则在程序终止之前关闭所有打开的文件(因此刷新所有输出流). 但是在这种情况下没有调用exit()return,这可能是导致问题的原因吗? - David Ranieri
4
代码没有问题,但我认为这个答案很误导人。 - Karoly Horvath
1
还有C11 7.21.2/2:“最后一行是否需要终止换行符是实现定义的”。 - M.M
1
@DavidRanieri:请注意,C99遵循C++98的规则,即从main()函数结尾掉出等同于执行return 0;。我不喜欢这个特性,认为它是一个缺陷。然而,自本千年以来,这已成为标准C语言的一部分,因此除非编译为C90,否则所示程序具有有效的退出状态。 - Jonathan Leffler
显示剩余5条评论

3

奇怪的是,似乎没有人发表过调整后的代码,在这里缓冲区被刷新...

#include <stdio.h>

int main (void)
{
    char a[]="abcde";
    printf ("%s", a);
    fflush(stdout);
    //On some systems the line above will fail, in that case use: fflush(NULL);
}

还要注意的是,这段代码可能不能实现你真正想要的功能。
我认为你真正想要做的是:

#include <stdio.h>

int main (void)
{
    char a[]="abcde";
    printf ("%s\n", a);
   //The '\n' makes sure the next thing you print will be on the following line
}

0

希望我能在不让人困惑的情况下谈几点。 Printf 不是被缓冲的东西,它是 stdio,因此所有类似的函数都会表现出相同的行为。 要演示缓冲,你只需要 printf 大量字符,通常超过 1024 个字符,printf 将在你超过最大缓冲区长度时自动 fflush。 当然,所有其他观点也是正确和有效的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接