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
但我不认为这个解决方案是优雅的,甚至是必要的.关于如何克服这个问题的任何想法?
编辑 - 因为我在大学里学习这个,我不能使用课程中没有学到的东西,所以我只能使用printf
和scanf
新编辑 - 我想我已经找到了解释.正如我所说,我正在输出到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.
您可以尝试写入stderr,而不是stdout.
fprintf(stderr, "Hello, please enter your age\n");
Run Code Online (Sandbox Code Playgroud)
您还应该看看这个相关的主题.
正如其他人指出的那样,输出可以在控制台或外壳程序有机会看到它之前缓冲在您的程序中。
在类 Unix 系统(包括 macs)上,stdout
默认情况下具有基于行的缓冲。这意味着您的程序在stdout
看到换行符后立即清空其缓冲区。
但是,在 Windows 上,换行不再是特殊的,而是使用了全缓冲。Windows 根本不支持行缓冲;请参阅setvbuf 上的 msdn 页面。
因此,在 Windows 上,一个好的方法是完全关闭stdout
缓冲,如下所示:
setvbuf (stdout, NULL, _IONBF, 0);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
161816 次 |
最近记录: |