【问题标题】:Clearing the buffer when using Getchar (there must be a better way!)使用 Getchar 时清除缓冲区(一定有更好的方法!)
【发布时间】:2017-05-13 14:14:00
【问题描述】:

我正在编写一个只需要获取单个数字的函数,我决定使用 getchar() 而不是 scanf()。

但是,由于我只需要一个字符,因此我没有使用数组来获取它。这会导致问题,因为我没有找到“/n”字符的循环。为了确保我的缓冲区在再次使用 getchar() 之前被清除,我写了这个:

while (getchar() != '\n'){}

它按我的需要工作,但这是解决这个问题的“正确”方法吗?

我尝试使用 fflush(stdin),但它似乎没有任何效果。

感谢您的所有回复,我经常查看 cmets 并愿意回答问题。

【问题讨论】:

  • while 在没有换行符时(例如在文件结尾处)运行到非终止循环。
  • @Jens 如果getchar成功则没有无限循环。
  • @VladfromMoscow 你怎么知道它会成功?
  • @Jens 通过检查 getchar 调用返回的值。
  • @VladfromMoscow 对;在这里只检查它是否是换行符。你能看出这怎么可能是一个非终止循环?提示:当 stdin 为 "foobar" 时会发生什么?

标签: c char getchar fflush


【解决方案1】:

请注意,根据 C 标准,fflush(stdin) 是未定义的行为,尽管它受到一些实现的支持。

这样做的惯用方法是:

int c;
while ((c = getchar()) != '\n' && c != EOF) {
    continue;
}

如果getchar() 中有错误,或者如果用户从键盘发出EOF 信号,则需要检查EOF 以避免无限循环。变量c 需要是int 以确保它可以保存EOF 的值,通常为-1。

还要注意这个方法要求输入流中至少有一个字符,否则getchar()会阻塞,等待输入。之前对getchar()scanf() 的调用将至少留下一个换行符,但对fgets() 的调用可能不会。

【讨论】:

    猜你喜欢
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多