【问题标题】:Why does "printf" not produce any output?为什么“printf”不产生任何输出?
【发布时间】:2017-01-03 23:21:22
【问题描述】:

我正在C 学习编程。你能解释一下为什么这里什么都没有打印吗?

#include <stdio.h>

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

【问题讨论】:

  • 在字符串或格式中添加“\n”。 -->> printf ("%s\n", a);
  • 为什么不打印?
  • 你需要从你的函数中返回一个int
  • 由于您没有以换行符结束输出,您可能看不清楚,因为它与您的 shell 提示符混合在一起。
  • 可能它有效,但您在提示之前不查看字符串。类似abcdeC:\Windows&gt;abcdeuser@host:~$

标签: c printf


【解决方案1】:

在许多系统上,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

【讨论】:

  • C 系统需要在程序结束时刷新输出。
  • @Barmar,好点:如果主函数返回到它的原始调用者,或者如果调用了退出函数,则在程序之前关闭所有打开的文件(因此所有输出流都被刷新)终止。 但在这种情况下,没有调用 exit()return,这可能是导致问题的原因吗?
  • 代码没有问题,我觉得这个答案很误导...
  • 还有C11 7.21.2/2“最后一行是否需要终止换行符是实现定义的”
  • @DavidRanieri:请注意,C99 遵循 C++98,因为从 main() 的末尾脱落相当于执行 return 0;。我不喜欢那样;我认为这是一个错误的特征。但是,它是整个千年的标准 C,因此显示的程序具有有效的退出状态,除非为 C90 编译。
【解决方案2】:

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

【讨论】:

    【解决方案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
    }
    

    【讨论】:

      猜你喜欢
      • 2023-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-27
      • 2013-04-06
      相关资源
      最近更新 更多