【问题标题】:Why does program not execute final printf statement?为什么程序不执行最终的 printf 语句?
【发布时间】:2012-07-01 22:19:27
【问题描述】:

我不明白为什么程序控制没有到达第三个 printf,就在 for 循环之后。

为什么不打印第三个printf

如果我将 for 循环更改为 while 循环,它仍然不会打印。

这是程序和输出:

main()
{
    double nc;

    printf ("Why does this work, nc = %f\n", nc);
    for (nc = 0; getchar() != EOF; ++nc)
    {
        printf ("%.0f\n", nc);
    }
    printf ("Why does this work, nc = %f", nc);
}

输出是:

Why does this work, nc = 0.000000
test
0
1
2
3
4

【问题讨论】:

  • 尝试在最后一个 printf 中添加换行符。
  • 这可能会回答你的问题:stackoverflow.com/a/1716621/748875
  • 出于兴趣:为什么 double 用于 nc? int 肯定会更传统吗?

标签: c for-loop terminal while-loop printf


【解决方案1】:

它对我来说很好,你是如何尝试终止程序的?一旦EOFgetchar() 检测为输入,for 循环应该结束。

EOF 在 Windows 下是 Control-Z (^Z),在 Linux/Unix 下是 Control-D (^D)。一旦我输入它,循环就会终止,我会得到最终的printf() 来显示它的输出。

最后一点(@DanielFisher 也提到过),在您的最终 printf() 调用末尾添加一个 '\n',因为您的特定实现可能需要它,否则程序的行为可能是未定义的(谢谢致 @KeithThompson 和 @AndreyT 在 cmets 中指出这一点):

 printf ("Why does this work, nc = %f\n", nc);

【讨论】:

  • 尾随 \n 不仅仅是风格。尾随'\n' 是否必需 由实现定义。如果需要,如果不提供,则程序的行为未定义。
  • @KeithThompson 有趣,你能详细说明一下这个要求吗,我以前没听说过这个。是否与是否导致输出缓冲区被刷新有关?
  • @Levon:关于文本流的语言规范在 7.19.2/2 中声明:“最后一行是否需要终止换行符是实现定义的。”
  • 为什么投反对票?我很乐意改进答案或纠正任何错误,但如果没有解释,它对 OP、SO 或我没有用。
  • @AndreyT 谢谢.. 我刚刚找到并阅读了它。消除了所有对风格的引用:)
【解决方案2】:

printf 被缓冲,这就是为什么最后一行可能不显示。 这意味着对printf 的调用可能不会导致直接输出,因为函数会在将数据放入输出(您的终端)之前累积数据。

在你最后一次 printf 之后调用 fflush 会将所有剩余的东西放在终端的缓冲区中。此外,每次请求换行时都会刷新缓冲区。

【讨论】:

    猜你喜欢
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    • 2021-11-18
    • 2010-11-11
    相关资源
    最近更新 更多