我正在使用Eclipse来编写C / C ++代码,而我正在努力解决可能非常简单的问题。在下面的代码中,我使用printf()
并在scanf()
之后。 Althougth printf
是在scanf()
输出不同之前编写的。我能够找到类似问题的here。但我无法解决它。有什么想法吗?
代码:
#include <stdio.h>
int main()
{
int myvariable;
printf("Enter a number:");
scanf("%d", &myvariable);
printf("%d", myvariable);
return 0;
}
预期产出:
Enter a number:1
1
相反,我得到:
1
Enter a number:1
答案 0 :(得分:32)
您的输出正在缓冲。 您有4个选项:
显式刷新
每次写入以从缓冲区中获利后, fflush
仍然明确强制执行所需的行为/显示。
fflush( stdout );
缓冲区只有缓冲区行
当你知道只打印完整的行时,非常有用
setlinebuf(stdout);
禁用缓冲区
setbuf(stdout, NULL);
通过它提供的选项菜单在控制台中禁用缓冲
以下是带有选项1的代码:
#include <stdio.h>
int main() {
int myvariable;
printf("Enter a number:");
fflush( stdout );
scanf("%d", &myvariable);
printf("%d", myvariable);
fflush( stdout );
return 0;
}
这是2:
#include <stdio.h>
int main() {
int myvariable;
setlinebuf(stdout);
printf("Enter a number:");
scanf("%d", &myvariable);
printf("%d", myvariable);
return 0;
}
和3:
#include <stdio.h>
int main() {
int myvariable;
setbuf(stdout, NULL);
printf("Enter a number:");
scanf("%d", &myvariable);
printf("%d", myvariable);
return 0;
}
答案 1 :(得分:6)
好的,所以最后我使用了类似于@zsawyer写的标签为3的选项。 在我的代码中,我插入了这一行:
setvbuf(stdout, NULL, _IONBF, 0);
作为main()中的第一行:
#include <stdio.h>
int main()
{
setvbuf(stdout, NULL, _IONBF, 0);
int myvariable;
printf("Enter a number:");
scanf("%d", &myvariable);
printf("%d", myvariable);
return 0;
}
我是从here获得的。
答案 2 :(得分:0)
快速而轻松,我只是定义了一个名为“ eprint”的宏,以在调用 printf(...)之后添加 flush() / strong>,而我只使用下面的eprint宏:
#define eprintf(...) printf(__VA_ARGS__); \
fflush(stdout); \
#include <stdio.h>
#include <stdlib.h>
#define eprintf(...) printf(__VA_ARGS__); \
fflush(stdout); \
int main(void) {
int a;
eprintf("a=");
scanf("%d",&a);
eprintf("I've read value %d.\n",a);
return EXIT_SUCCESS;
}
a=5
I've read value 5.
PS:我只花了30分钟的时间来查找这个Eclipse控制台问题和可能的修复程序,对于任何想找这种东西的人来说,这似乎是最直接,最容易理解的事情。