【问题标题】:What does it mean to "flush the input buffer"?“刷新输入缓冲区”是什么意思?
【发布时间】:2021-11-19 02:11:27
【问题描述】:
int prompt(const char *output_message, char *input, const int MAX_SIZE)
{
    printf("%s", output_message);

    int i = 0;
    char ch = '\0';

    while (1)
    {
        ch = (char)getchar();

        if (ch == '\n' || ch == EOF)
        {
            break;
        }
        else if (i < (MAX_SIZE - 1))
        {
            input[i++] = ch;
        }
    }

    input[i] = '\0';

    return i;
}

我编写了这个函数来获取用户输入的输入字符串。因此 getchar() 正在遍历缓冲区,直到到达换行符或文件末尾。我的问题是刷新输入缓冲区是否意味着将 FILE 指针(或那里的任何实现)从缓冲区中当前写入的部分移开,就像我对 getchar() 所做的那样? “刷新输入缓冲区”究竟是什么意思?

【问题讨论】:

  • 与您提出的问题无关,但是:您需要将ch 声明为int 类型,并且在调用getchar 时不需要(char) 演员表。
  • @SteveSummit 但是当我使用 input[i++] = ch;所以我认为这不是一个好主意。
  • 另一方面,我认为这是一个非常的好主意,但如果你不相信我,这里还有其他几个问题:1 234567。存储到 input 数组时,您不需要任何显式转换 — 谁告诉你的?
  • @SteveSummit 编译器给了我一个警告。
  • 警告:隐式转换丢失整数精度:'int' to 'char' [-Wimplicit-int-conversion] input[i++] = ch;

标签: c string buffer


【解决方案1】:

“刷新输入缓冲区”是指尝试从输入流中丢弃不需要的字符,以免它们干扰以后的输入调用。

在您的代码中,您似乎不会遇到这个问题,因此刷新输入缓冲区对您来说应该不是问题。

当您使用scanf 进行输入时,通常会出现不需要的输入问题。 scanf 通常将用户的换行符留在输入缓冲区中,但稍后对 getcharfgets(甚至 scanf)的调用可能会被此严重混淆。

刷新输入的问题在于没有真正的好方法。一种流行但推荐的技术是致电fflush(stdin)。看起来它应该只是票,但问题是它没有明确定义并且不能保证工作(尽管一些程序员发现它在某些平台上对他们来说足够好)。

有关此问题的更多信息,请参阅 this questionthis question(可能还有 this one)。

【讨论】:

  • 知道了,所以在我调用 getchar() 之后,前一个字符是否仍然位于输入流中,还是被清除了?从我读到的内容来看,该标准确实反对将 fflush 与 stdin 一起使用。
  • 我还编写了一个名为 scanf_flush 的函数来解决这个问题。但是,我想我想将“scanf_flush”重命名为“prompt”,将“prompt”重命名为“prompt_c_str”。有更好的名字创意吗?
  • getchar 从输入流中删除个字符,因为它提供给您。这就是几乎所有输入函数的工作方式(任何语言)。我不会称之为“冲洗”;这只是普通的阅读。查看下一个字符而不删除它是相当少见的,通常有一个像“peek”这样的名字,而不是“get”或“read”。 (顺便说一句,C 根本没有“peek”调用。如果您想查看下一个字符但将其留在输入流中,则必须使用 getchar 读取它,然后将其放回 在输入流上使用ungetc。)
  • 总而言之:如果你看下一个字符而不删除它,那就是“偷看”;如果你删除它而不看它,那就是“冲洗”,如果你同时做——看看它并删除它——那就是“get”,或者普通阅读。
  • 我对名为scanf_flush 的函数的建议不是重命名,而是消除它。我认为在调用scanf 时尝试刷新输入是不值得的。如果您对scanf 的使用不起作用,并且修复它的方法似乎是尝试刷新输入,我相信正确的解决方案是使用scanf 一些不需要刷新的不同方式,或者不需要担心它(正如我解释的here),或use something other than scanf
猜你喜欢
  • 2013-02-09
  • 2010-10-13
  • 1970-01-01
  • 1970-01-01
  • 2019-01-30
  • 1970-01-01
  • 2014-06-11
  • 2022-10-02
  • 2020-07-21
相关资源
最近更新 更多