【发布时间】:2014-11-22 13:20:10
【问题描述】:
我正在使用我创建的宏在 scanf 后清除缓冲区,但有人告诉我这不是一个好主意,因为“很多原因”。您能解释一下为什么以及如何清洁它吗?我知道使用 fflush(stdin) 是一个非常糟糕的主意,因为它没有被定义。
这是我使用的宏:
#define CLEAR_BUFFER do { c = getchar(); } while (c != '\n' && c != EOF);
另外,另一个问题:在“现实世界”中使用 scanf 吗?如果是,人们如何清理缓冲区?
谢谢
【问题讨论】:
-
如果您在阅读某些内容后遇到空格或换行符问题,您可以在
%d、%f或类似名称之前放置一个空格以消除它们,例如scanf(" %d",x) -
对于用户输入,使用
fgets()获取数据并很好地处理行缓冲输入流。 -
@pmg 对于健壮的代码,fgets 也需要清理,因为该行可能超过缓冲区大小
-
@humodz "...在 %d..." 之前放一个空格 不需要。
"%d"将使用可选的前导空格,即使格式中没有前面的" "。这适用于除"%c"、"%n"、"%["之外的所有scanf()说明符。 -
什么是“bad”这个名字。我至少会称它为
CLEAR_STDIN?
标签: c