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是优雅的,甚至是必要的。 关于如何克服这个问题的任何想法?
编辑 – 因为我在我的大学学习,我不能使用在课程中没有学到的东西,所以我只能使用printf
和scanf
新编辑 – 我想我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);
- 在您的项目文件夹中,创build一个“.gdbinit”文本文件。 它将包含你的gdbdebugging器configuration
- 编辑“.gdbinit”,并添加行(不带引号):“set new console on”
-
在构build项目之后,右键单击项目Debug>“Debug Configurations”,如下所示
-
在“debugging器”选项卡中,确保“GDB命令文件”现在指向您的“.gdbinit”文件。 否则,请将pathinput到“.gdbinit”configuration文件中:
-
点击“应用”和“debugging”。 本地DOS命令行应该如下所示启动
将c:\gygwin\bin
添加到PATH
环境variables中,作为系统环境variables或者在eclipse项目中(properties-> run / debug-> edit)