我开始使用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
的字符串值,但未将其输出到控制台。我必须输入一个数字,然后只有缓冲区将所有数据倒入控制台,所以我看到控制台是这样的:
1
Hello, please enter your age:
Your age is 1
而不是预期的:
Hello, please enter your age:
1
Your age is 1
现在,我发现我可以在第一个fflush(stdout)
之后使用printf
,但我不认为这个解决方案是优雅的,甚至是必要的。关于如何克服这个问题的任何想法?
编辑 - 因为我在大学里学习这个,所以我不能使用课程中没有学到的东西,所以我只能使用{{ 1}}和printf
NEW EDIT - 我想我已经找到了解释。正如我所说,我正在输出到Eclipse内的控制台视图。奇怪的是,如果我从Windows的命令行编译并运行程序,我得到想要的结果。因此,我认为eclipse实际上是将输出写入文件并在控制台窗口中显示。如何强制eclipse在我的运行配置中打开一个真正的命令行窗口?
答案 0 :(得分:20)
输出已缓冲。
默认情况下,stdout是行缓冲的,这意味着'\ n'应该刷新缓冲区。 为什么你的情况没有发生?不知道。需要有关您的应用程序/环境的更多信息。
但是,您可以使用setvbuf()控制缓冲:
setvbuf(stdout, NULL, _IOLBF, 0);
这将强制stdout进行行缓冲。
setvbuf(stdout, NULL, _IONBF, 0);
这将强制stdout无缓冲,因此您不需要使用fflush()。 请注意,如果您有大量打印件,它将严重影响应用程序性能。
答案 1 :(得分:20)
显然这是Eclipse的已知错误。使用WONT-FIX的解决方案解决了这个错误。我不知道为什么。链接在这里: Eclipse C Console Bug
答案 2 :(得分:7)
在打印之前尝试设置:
setvbuf (stdout, NULL, _IONBF, 0);
答案 3 :(得分:6)
答案 4 :(得分:4)
正如其他人所指出的那样,在控制台或shell有机会看到输出之前,可以在程序中缓冲输出。
在类似unix的系统(包括mac)上,stdout
默认具有基于行的缓冲。这意味着您的程序一看到换行符就会清空其stdout
缓冲区。
但是,在Windows上,换行符不再特殊,并且使用了完全缓冲。 Windows根本不支持行缓冲;见the msdn page on setvbuf。
所以在Windows上,一个好的方法就是像这样完全关闭stdout
缓冲:
setvbuf (stdout, NULL, _IONBF, 0);
答案 5 :(得分:1)
将c:\gygwin\bin
添加到PATH
环境变量,作为系统环境变量或在eclipse项目中(properties-&gt; run / debug-&gt; edit)
答案 6 :(得分:1)
构建项目后,右键单击项目Debug&gt; “调试配置”,如下所示
在“调试器”选项卡中,确保“GDB命令文件”现在指向“.gdbinit”文件。否则,输入“.gdbinit”配置文件的路径:
单击“应用”和“调试”。应启动本机DOS命令行,如下所示