【问题标题】:c code is inexplicably skipping linesc代码莫名其妙地跳行
【发布时间】:2013-11-16 20:50:43
【问题描述】:

当我出于某种原因编译这个小程序时,"printf("done")" 行没有执行,我不知道为什么。在我的 print 语句之前最初有一个 if 块,并且也没有执行。我尝试通过 gdb 运行它并单步执行它。它找到了该行,但没有执行它。我正在尝试使用 gcc 4.7.2 编译它,并且我使用 gedit 3.4.2 作为我的文本编辑器。

这是我用来编译它的命令。

gcc teststuff.c -o test

这是代码

#include <stdio.h>

void testmethod()
{

   int sign = 1;
   printf("hello\n");
   printf("%d\n",sign);


   printf("done");
}

main(void)
{
   testmethod();
   return 0;
}

有人知道为什么要跳过那部分代码吗?谢谢!

【问题讨论】:

  • 你试过printf("done\n");吗?

标签: c gcc


【解决方案1】:

在末尾添加一个换行符。

printf("done\n");

标准输出通常是行缓冲的,这意味着您写入的数据只有在您完成一行后才会刷新到屏幕上(除非您明确刷新它,例如使用fflush())。但是,它应该在程序退出时刷新(但不一定在程序退出之前)。

另外,根据你的 shell,如果一个程序在没有换行符的情况下写入数据,你可能会在输出顶部看到你的命令提示符:

my-computer ~/projects/my-program $ ./a.out
hello
1
donemy-computer ~/projects/my-program $

【讨论】:

  • 这也解释了我的 if 语句,因为我里面只有 print 语句,也没有换行符。
【解决方案2】:

这是因为您的程序在Done 行有机会打印到控制台之前完成并结束。

控制台输出通常是缓冲的。字符串"done" 保留在stdout 的缓冲区中,直到流被刷新。您可以通过调用fflush(stdout) 手动执行此操作,或将\n 添加到"done" 字符串的末尾。打印行尾字符会导致控制台流将缓冲区清空到屏幕上(除非您设置了一个特殊的输出模式,让 \n 被缓冲直到显式刷新)。

【讨论】:

    猜你喜欢
    • 2012-03-12
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    • 2013-08-02
    • 2014-05-22
    • 2014-01-23
    相关资源
    最近更新 更多