40

我开始使用 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但我不认为这个解决方案是优雅的,甚至是必要的。关于如何克服这个问题的任何想法?

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

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

4

7 回答 7

34

输出被缓冲。

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

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

setvbuf(stdout, NULL, _IOLBF, 0);

这将强制标准输出被行缓冲。

setvbuf(stdout, NULL, _IONBF, 0);

这将强制 stdout 无缓冲,因此您不需要使用 fflush()。请注意,如果您有大量打印件,它将严重影响应用程序的性能。

于 2012-10-23T16:43:09.927 回答
22

显然这是 Eclipse 的一个已知错误。WONT-FIX 解决了这个错误。我不知道为什么。这是链接: Eclipse C 控制台错误

于 2012-10-27T20:19:36.340 回答
8

在打印之前尝试设置:

setvbuf (stdout, NULL, _IONBF, 0);
于 2012-10-23T16:42:58.883 回答
7

您可以尝试写入标准错误,而不是标准输出。

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

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

于 2012-10-23T16:33:29.117 回答
5

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

在包括 mac 在内的类 unix 系统上,stdout默认情况下具有基于行的缓冲。这意味着您的程序stdout一看到换行符就会清空其缓冲区。

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

所以在 Windows 上,一个好的方法是像这样完全关闭stdout缓冲:

setvbuf (stdout, NULL, _IONBF, 0);
于 2014-06-19T17:52:40.193 回答
1

作为系统环境变量或在 Eclipse 项目中添加c:\gygwin\bin到环境变量(属性-> 运行/调试-> 编辑)PATH

于 2013-10-02T14:04:02.847 回答
1
  1. 在您的项目文件夹中,创建一个“.gdbinit”文本文件。它将包含您的 gdb 调试器配置
  2. 编辑“.gdbinit”,并添加行(不带引号):“set new-console on”</li>
  3. 构建项目后右键项目Debug>“Debug Configurations”,如下图 调试配置

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

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

于 2014-12-01T13:12:42.147 回答