printf不在控制台上打印

我开始使用C语言。 我使用eclipse(juno)作为我的IDE并安装了CDT插件。 我也解开了mingw64(GCC编译器)。 我写了一个非常简单的程序来看看它是否工作。 这是我的代码:

#include <stdio.h> int main() { int age; printf("Hello, please enter your age:\n"); scanf("%d", &age); printf("Your age is %d", age); return 0; } 

问题在于输出缓冲区中填充了第一个printf的string值,但不会将其输出到控制台。 我必须input一个数字,然后缓冲区才会把所有的数据传送到控制台,所以我看到控制台是这样的:

 1 Hello, please enter your age: Your age is 1 

而不是预期的是:

 Hello, please enter your age: 1 Your age is 1 

现在,我发现我可以在第一个printf之后使用fflush(stdout) ,但我不认为这个解决scheme是优雅的,甚至是必要的。 关于如何克服这个问题的任何想法?

编辑 – 因为我在我的大学学习,我不能使用在课程中没有学到的东西,所以我只能使用printfscanf

新编辑 – 我想我find了一个解释。 正如我所说的,我输出到Eclipse内部的控制台视图。 奇怪的是,如果我从Windows的命令行编译并运行程序,我会得到想要的结果。 因此,我认为eclipse实际上是将输出写入文件并将其显示在控制台窗口中。 我如何强制eclipse打开一个真正的命令行窗口在我的运行configuration?

好的 – 显然这是一个已知的日食bug。 这个错误是通过WONT-FIX的分辨率解决的。 不知道为什么。 链接在这里:
Eclipse C控制台错误

输出被缓冲。

标准输出是默认行缓冲,这意味着'\ n'应该刷新缓冲区。 为什么不在你的情况发生? 不知道。 需要更多关于你的应用程序/环境的信息

但是,您可以使用setvbuf()来控制缓冲:

 setvbuf(stdout, NULL, _IOLBF, 0); 

这将强制stdout被行缓冲。

 setvbuf(stdout, NULL, _IONBF, 0); 

这将迫使标准输出无缓冲,所以你不需要使用fflush()。 请注意,如果您有大量打印件,将严重影响应用程序的性能。

你可以尝试写stderr,而不是标准输出。

 fprintf(stderr, "Hello, please enter your age\n"); 

你也应该看看这个相关的线程。

在打印之前尝试设置:

 setvbuf (stdout, NULL, _IONBF, 0); 

正如其他人所指出的,在控制台或shell有机会看到它之前,输出可以在程序中被缓冲。

在类Unix系统(包括mac)上,默认情况下, stdout具有基于行的缓冲区。 这意味着你的程序一看到一个换行符就清空它的stdout缓冲区。

但是,在Windows上,换行不再是特殊的,而是使用完全缓冲。 Windows根本不支持行缓冲; 请参阅setvbuf上的msdn页面 。

所以在Windows上,一个好的方法是彻底closuresstdout缓冲,如下所示:

 setvbuf (stdout, NULL, _IONBF, 0); 
  1. 在您的项目文件夹中,创build一个“.gdbinit”文本文件。 它将包含你的gdbdebugging器configuration
  2. 编辑“.gdbinit”,并添加行(不带引号):“set new console on”
  3. 在构build项目之后,右键单击项目Debug>“Debug Configurations”,如下所示 调试配置

  4. 在“debugging器”选项卡中,确保“GDB命令文件”现在指向您的“.gdbinit”文件。 否则,请将pathinput到“.gdbinit”configuration文件中: Gdb配置

  5. 点击“应用”和“debugging”。 本地DOS命令行应该如下所示启动 安慰

c:\gygwin\bin添加到PATH环境variables中,作为系统环境variables或者在eclipse项目中(properties-> run / debug-> edit)