printf无法在控制台上打印

Mr *_* T. 37 c eclipse printf gcc 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;
}
Run Code Online (Sandbox Code Playgroud)

问题是输出缓冲区填充了第一个字符串的值,printf但不会将其输出到控制台.我必须输入一个数字,然后只有缓冲区将所有数据倒入控制台,所以我看到控制台是这样的:

1
Hello, please enter your age:
Your age is 1
Run Code Online (Sandbox Code Playgroud)

而不是预期的:

Hello, please enter your age:
1
Your age is 1
Run Code Online (Sandbox Code Playgroud)

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

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

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

kli*_*eyn 23

输出被缓冲.

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

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

setvbuf(stdout, NULL, _IOLBF, 0);
Run Code Online (Sandbox Code Playgroud)

这将强制stdout进行行缓冲.

setvbuf(stdout, NULL, _IONBF, 0);
Run Code Online (Sandbox Code Playgroud)

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


Mr *_* T. 20

显然这是Eclipse的已知错误.使用WONT-FIX的解决方案解决了这个错误.我不知道为什么.这是链接: Eclipse C Console Bug.

  • 还是没有解决。必须在代码中禁用或以其他方式处理缓冲。 (2认同)

use*_*049 7

在打印之前尝试设置:

setvbuf (stdout, NULL, _IONBF, 0);
Run Code Online (Sandbox Code Playgroud)


Kit*_*chi 6

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

fprintf(stderr, "Hello, please enter your age\n");
Run Code Online (Sandbox Code Playgroud)

您还应该看看这个相关的主题.

  • 有时,如果编译器认为,它的输出到一些文件类型的,而不是一个控制台,直到它完全充满,即使是换行也不会刷新缓冲区.也许这就是正在发生的事情,因为你通过gcc获得了你想要的东西. (2认同)

Tyl*_*ler 5

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

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

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

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

setvbuf (stdout, NULL, _IONBF, 0);
Run Code Online (Sandbox Code Playgroud)