【问题标题】:I am not able to flush stdin我无法刷新标准输入
【发布时间】:2011-01-12 08:22:05
【问题描述】:

如何刷新标准输入

为什么在下面的代码 sn-p 中不起作用?

#include <string.h>
#include <stdio.h>
#include <malloc.h>
#include <fcntl.h>

int main()
{
        int i=0,j=0, sat;
        char arg[256];
        char * argq;
        argq = malloc(sizeof(char)*10);

        printf("Input the line\n");
        i=read(0, arg, sizeof(char)*9);
        arg[i-1]='\0';
        fflush(stdin);

        i=read(0, argq, sizeof(char)*5);
        argq[i-1]='\0';

        puts(arg);
        puts(argq);

        return 0;
}

现在,如果我将输入作为 11 个字符,则应仅读取 9 个字符,但不会刷新标准输入中的剩余两个字符并在 argq 中再次读取。为什么?

输入: 123 456 789

输出: 123 456 89

为什么我得到这个 89 作为输出?

【问题讨论】:

  • 因为 fflush() 只为输出流定义。
  • 您始终可以创建自己的函数来丢弃输入字符。如果您将其命名为ignore,那么您可能更接近 C++ 流。 ;-)

标签: c stdin fflush


【解决方案1】:

我相信 fflush 仅用于输出流。

您可以在 Linux 上尝试 fpurge__fpurge。请注意, fpurge 是非标准的且不可移植。您可能无法使用它。

来自Linux fpurge man page:通常想要丢弃输入缓冲区是错误的。

用于刷新标准输入的最便携的解决方案可能类似于以下内容:

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

【讨论】:

  • 很好 - 不知道 fpurge()
  • 或者,更简单:scanf("%*[^\n]%*c"); 当然,您也可以将其合并到现有scanf 格式字符串的末尾,以便在用scanf 处理部分行后丢弃剩余的行..
  • @R.. 也许您可以更详细地解释提供的正则表达式,即使它已经 5 年了。或者提供一个指向可以澄清它的材料的链接。
  • @Ungeheuer:这不是正则表达式。 scanf %[ 应使用 scanf 记录的转换说明符。
【解决方案2】:
【解决方案3】:
int c;
while((c = getchar()) != '\n' && c != EOF);

我将如何清除输入缓冲区。

【讨论】:

  • 如果这样做可能会有潜在的不利影响。后面说你想用fgets读取stdin,这是空的,那么你必须在实际输入之前先输入enter键。
【解决方案4】:

如何刷新标准输入?

刷新输入流正在调用未定义的行为。不要尝试。

您只能刷新输出流。

【讨论】:

    【解决方案5】:

    您正在用'\0' 覆盖arg 中输入的最后一个元素。那行应该是arg[i]='\0';(在错误和边界检查之后你丢失了。)

    其他人已经评论了冲洗部分。

    【讨论】:

      【解决方案6】:

      在 Linux 中清理标准输入时会遇到命令在某些情况下开始等待输入的情况。解决的办法就是把所有的std::cin替换成readLineToStdString():

      void readLine(char* input , int nMaxLenIncludingTerminatingNull )
      {
          fgets(input, nMaxLenIncludingTerminatingNull , stdin);
      
          int nLen = strlen(input);
      
          if ( input[nLen-1] == '\n' )
              input[nLen-1] = '\0';
      }
      
      std::string readLineToStdString(int nMaxLenIncludingTerminatingNull)
      {
          if ( nMaxLenIncludingTerminatingNull <= 0 )
              return "";
      
          char* input = new char[nMaxLenIncludingTerminatingNull];
          readLine(input , nMaxLenIncludingTerminatingNull );
      
          string sResult = input;
      
          delete[] input;
          input = NULL;
      
          return sResult;
      }
      

      这也将允许您在 std::cin 字符串中输入空格。

      【讨论】:

        【解决方案7】:

        在 Windows 中,您可以使用 rewind(stdin) 功能。

        【讨论】:

        • 为什么不将经过测试的代码 sn-p 与您的代码一起发布。因为倒带并不是为了做 OP 想要实现的目标。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-22
        • 2011-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-11
        相关资源
        最近更新 更多