如何在fgets溢出后清空输入缓冲区?

4

当输入字符串超过预定义的限制时,我在使用 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. 是否有方法可以在不输入额外回车的情况下清除缓冲区? 2. 如何为此实现错误处理?因为fgets返回值将是非null值,并且strlen(input)给出fgets接受的字符串大小,应该做什么?

非常感谢。


如果您不断编辑您的帖子,其他人的回答在未来将毫无意义。SO 的目标不仅是解决特定问题,还帮助其他人搜索答案。 - P0W
我会重新处理它。抱歉! - Hooli
@IDK请不要回退,现在问题似乎是您所需要的... - Gangadhar
2个回答

4
如果我理解正确的话,你想要避免在输入在范围内时按两次回车键。
一种解决方法是:
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


对我有用!你能解释一下限制部分吗? - Hooli
如果你的 MAXLEN 是10,当你输入 abcdefgh 并按下 ENTER 键后,它会再次等待另一个 ENTER 键。 - P0W
它并不是这样的,也没有必要。我输入了一个字符串,如果它的长度等于9(当然不包括空字符),那么这个字符串可能已经溢出了。是否存在与'\n'相关的代码依赖问题,这就是为什么它不等待的原因?请参考上面的代码。谢谢! - Hooli
1
对于你的情况,fflush(stdin) 应该可以正常工作。 但是高度不建议使用它,因为在某些 C 实现中可能会导致 UB。 相反,应该使用 while((ch = getchar())!='\n' && ch != EOF ); - P0W

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

或者:

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

针对 @OP:首选阅读"如何Flush输入缓冲区?" - Grijesh Chauhan
我认为 OP 已经尝试过这个 "//尝试清除缓冲区的代码",他想要避免在输入未溢出时重复按下回车键。 - P0W
这段代码应该放在调用 fgets 之后,而不是之前,并且只有在由 fgets 填充的缓冲区未以 '\n' 结尾时才应该调用。 - R.. GitHub STOP HELPING ICE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接