c代码莫名其妙地跳过了行

时间:2013-11-16 20:50:43

标签: c gcc

当我因某种原因编译这个小程序时,“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;
}

任何人都有任何想法为什么它会跳过这部分代码?谢谢!

2 个答案:

答案 0 :(得分:5)

在最后加上换行符。

printf("done\n");

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

此外,根据您的shell,如果程序在没有换行符的情况下写入数据,您可能会在输出之上获得命令提示符:

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

答案 1 :(得分:2)

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

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