我正在开始学习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
现在,我发现我可以在第一个 "printf "之后使用 "fflush(stdout)",但我不认为这个解决方案是优雅的,甚至是必要的。有什么办法可以克服这个问题吗?
编辑 - 因为我在大学里学习这个,我不能使用任何在课程中没有学到的东西,所以我只能**使用printf
和scanf
。
新编辑 - 我想我已经找到了一个解释。正如我所说,我正在向Eclipse内部的控制台视图输出。奇怪的是,如果我从Windows的命令行中编译并运行该程序,我得到了想要的结果。因此,我认为eclipse实际上是将输出写入一个文件并在控制台窗口中显示出来。我怎样才能迫使eclipse在我的运行配置中打开一个真正的命令行窗口?
输出是缓冲的。
stdout默认是行缓冲的,这意味着'\n'应该冲刷缓冲区。 为什么在你的情况下没有发生呢?不知道。需要更多关于你的应用程序/环境的信息。
不过,你可以用setvbuf()来控制缓冲区:
setvbuf(stdout, NULL, _IOLBF, 0);
这将强制stdout采用行缓冲。
setvbuf(stdout, NULL, _IONBF, 0);
这将强制stdout为非缓冲状态,所以你不需要使用fflush()。 注意,如果你有大量的打印文件,这将严重影响应用程序的性能。