提问人:quapka 提问时间:6/2/2013 最后编辑:Mark Rotteveelquapka 更新时间:6/20/2022 访问量:50377
扫描()问题之前的C / C++ printf()
C/C++ printf() before scanf() issue
问:
我正在使用 Eclipse 编写 C/C++ 代码,我正在努力解决可能非常简单的事情。在下面的代码中,我使用 和 之后。Althougth 是在输出不同之前写入的。我能够在这里找到有关类似问题的信息。但我无法解决它。有什么想法吗?printf()
scanf()
printf
scanf()
法典:
#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
答:
49赞
zsawyer
6/2/2013
#1
您的输出正在缓冲。 您有 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;
}
评论
0赞
quapka
6/2/2013
谢谢。第一个选项有效。但是,考虑到编写更长、更复杂的代码,这似乎是一个相当混乱的解决方案。我的意思是,这就像将工作量加倍。不过,我会尝试第四个。
0赞
zsawyer
6/2/2013
如果您不关心缓冲及其可能的好处,则可以选择选项 3。这是一个单行代码(在您的程序中仅设置一次并完成)。如果您不想或根本无法更改代码,则选项 4 是一种替代方法。如果没有换行符,选项 2 可能无法可靠地回显您的输入。
0赞
Jonathan Leffler
9/15/2016
每行末尾都有一个换行符会更好。只有当您有意识地零碎地构建一行输出时,才省略换行符。printf("%d", myvariable);
0赞
jamesdlin
11/14/2018
如果用 代替 和 用代替 ,这个答案会更好。 是 C 标准库的一部分;另外两个不是。setvbuf(..., _IONBF, ...)
setbuf
setvbuf(..., _IOLBF, ...)
setlinebuf
setvbuf
6赞
quapka
6/2/2013
#2
好的,最后我使用了类似于@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;
}
我是从这里得到的。
评论