printf无法在控制台上打印

时间:2012-10-23 16:26:55

标签: c eclipse gcc printf scanf

我开始使用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在我的运行配置中打开一个真正的命令行窗口?

7 个答案:

答案 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)

您可以尝试写入stderr,而不是stdout。

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

您还应该查看this相关主题。

答案 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)

  1. 在项目文件夹中,创建“.gdbinit”文本文件。它将包含您的gdb调试器配置
  2. 编辑“.gdbinit”,并添加该行(不带引号):“set new-console on”
  3. 构建项目后,右键单击项目Debug&gt; “调试配置”,如下所示 Debug configuration

  4. 在“调试器”选项卡中,确保“GDB命令文件”现在指向“.gdbinit”文件。否则,输入“.gdbinit”配置文件的路径: Gdb configuration

  5. 单击“应用”和“调试”。应启动本机DOS命令行,如下所示 Console