关于C#:printf无法在控制台上打印

printf not printing on console

我正在开始使用C语言。我正在使用eclipse(juno)作为我的IDE并安装了CDT插件。我还打开了mingw64(GCC编译器)的包装。我写了一个非常简单的程序,看它是否有效。这是我的代码:

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

int main()
{
    int age;
    printf("Hello, please enter your age:
"
);
    scanf("%d", &age);
    printf("Your age is %d", age);
    return 0;
}

问题在于输出缓冲区中填充了第一个printf的字符串值,但没有将其输出到控制台。我必须输入一个数字,然后缓冲区才会将所有数据倒入控制台,因此我看到控制台是这样的:

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

而不是预期的是:

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

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

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

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


输出被缓冲。

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

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

1
setvbuf(stdout, NULL, _IOLBF, 0);

这将强制stdout进行行缓冲。

1
setvbuf(stdout, NULL, _IONBF, 0);

这将强制将stdout取消缓冲,因此您无需使用fflush()。
请注意,如果您有很多印刷品,它将严重影响应用程序的性能。


显然,这是Eclipse的已知错误。通过WONT-FIX的分辨率解决了此错误。我不知道为什么。链接在这里:
Eclipse C控制台错误。


在打印之前,请尝试进行以下设置:

1
setvbuf (stdout, NULL, _IONBF, 0);


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

1
2
fprintf(stderr,"Hello, please enter your age
"
);

您还应该查看此相关线程。


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

在包括Mac在内的类Unix系统上,默认情况下stdout具有基于行的缓冲。这意味着您的程序在看到换行符后便立即清空其stdout缓冲区。

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

因此,在Windows上,一种好方法是完全关闭stdout缓冲,如下所示:

1
setvbuf (stdout, NULL, _IONBF, 0);

  • 在您的项目文件夹中,创建一个" .gdbinit"文本文件。它将包含您的gdb调试器配置
  • 编辑" .gdbinit",并添加以下行(不带引号):" set new-console on"
  • 生成项目后,右键单击项目Debug>" Debug Configurations",如下所示
    Debug configuration

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

  • 单击"应用"和"调试"。本地DOS命令行应如下所示启动
    Console


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