【问题标题】:How to clear input buffer after fgets overflow?fgets溢出后如何清除输入缓冲区?
【发布时间】:2013-08-21 04:40:58
【问题描述】:

当输入字符串超过其预定义的限制时,我在使用 fgets 时遇到了一点问题。

以下面的例子为例:

    for(index = 0; index < max; index++)
    {printf(" Enter the %d string : ",index+1)
                if(fgets(input,MAXLEN,stdin))
                {
                    printf(" The string and size of the string is %s and %d \n",input,strlen(input) + 1);
                    removeNewLine(input);
                    if(strcmp(input,"end") != 0)
                   { //Do something with input
                   }
                }

现在,当我超过长度 MAXLEN 并输入一个字符串时,我知道输入将在 MAXLEN -1 处附加一个 '\0' ,就是这样。当我尝试输入不要求输入的第二个字符串时会出现问题,即

Output :
Enter the first string : Aaaaaaaaaaaaaaaaaaaa //Exceeds limit
Enter the second string : Enter the third string : ....Waits input

所以,我认为我应该像在 C 中那样以标准方式清除缓冲区。它会等到我输入

return

两次,第一次被附加到字符串中,下一次,期待更多的输入和另一个返回。 1. 有什么方法可以在不输入额外return的情况下清空buffer? 2. 如何实现相同的错误处理?因为 fgets 返回值将是 Non-null 并且 strlen(input) 给了我 fgets 接受的字符串大小,应该怎么做?

非常感谢

【问题讨论】:

  • 如果您继续编辑您的帖子,其他人的答案在未来将没有任何意义。 SO 的目的不是解决具体问题,而是帮助他人寻找答案。
  • 我会恢复它。对不起!
  • @IDK 请不要回复,现在问题似乎你需要什么......

标签: c overflow fgets


【解决方案1】:

如果我理解正确,看起来你想避免两次输入,当输入的输入在范围内时。

解决办法是

for(index = 0; index < max; index++)
{
    printf(" Enter the %d th string :",index);
    // if (strlen(input) >=MAXLEN )

    if(fgets(input,MAXLEN,stdin))
    {

        removeNewLine(input);

        if(strcmp(input,"end") != 0)
        // Do something with input 
          ;
    }
    if (strlen(input) == MAXLEN-1 )
      while((ch = getchar())!='\n'  && ch != EOF  );

 }

当输入的字符正好是 MAXLEN-2 时,它会再次要求输入两次。

否则,您可以简单地使用逐个字符输入来形成您的input

【讨论】:

  • 为我工作!你能解释一下限制部分吗?
  • @IDK,假设你的 MAXLEN 是 10 ,如果你输入 abcdefghENTER 它将再次等待另一个 ENTER
  • 不是,为什么要这样?我输入了一个字符串,如果它的字符串长度等于 9,不包括空字符,当然,字符串可能溢出。这里有任何与 '\n' 相关的代码相关问题,这就是为什么它不等待?参考上面的代码。谢谢!
  • 好吧,对于您的情况,fflush(stdin) 应该可以正常工作。但强烈建议不要使用它,因为它可能会导致某些 C 实现上出现 UB。 while((ch = getchar())!='\n' &amp;&amp; ch != EOF ); 改为使用。
【解决方案2】:
while ((c=getchar()) != '\n' && c != EOF)
    ;

或:

scanf("%*[^\n]%*c");

【讨论】:

  • 对于@OP:对于首选阅读"How to Flush the input buffer?"
  • 我认为OP已经尝试过这个"//试图清除缓冲区"并且他想避免两次输入,当输入的输入没有溢出时
  • 这段代码应该移动到之后调用fgets,而不是之前,并且应该只在fgets填充的缓冲区没有结束时调用在'\n'.
猜你喜欢
  • 2016-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多