【问题标题】:fgets instructions gets skipped.Why?fgets 指令被跳过。为什么?
【发布时间】:2010-05-25 17:44:25
【问题描述】:

每当我在 fgets 之前执行 scanf 时,都会跳过 fgets 指令。我在 C++ 中遇到过这个问题,我记得我必须有一些指令来清除标准输入缓冲区或类似的东西。我想 C 有一个等价物。它是什么?

谢谢。

【问题讨论】:

  • 代码,请.. ?
  • 您可能会发现使用fgets 处理所有输入会更容易,然后在要解析一行中的值时使用sscanf
  • @Tim Post:我认为这对大多数用户来说是如此严格,因此没有必要。我认为这个问题已经足够详细了。

标签: c scanf fgets


【解决方案1】:

我敢打赌这是因为 \n 卡在输入流中。

查看以下问题之一:

I am not able to flush stdin.
How do I go about Flushing STDIN here?
scanf() causing infinite loop

this answer

还有:Why not to use scanf()

附: fgets() 是一个函数,而不是一条指令。

【讨论】:

    【解决方案2】:

    调用scanf() 之后的fgets() 函数可能1没有被跳过。 可能1在输入流中找到换行符后立即返回。

    fgets() 之前调用scanf() 几乎总是会导致scanf() 在输入流中留下一个未使用的换行符('\n'),这正是fgets() 正在寻找的。​​p>

    为了混合使用scanf()fgets(),您需要从输入流中删除调用scanf() 留下的换行符。

    刷新标准输入(包括换行符)的一种解决方案是类似于以下内容:

    int c;
    /* discard all characters up to and including newline */
    while ((c = getchar()) != '\n' && c != EOF); 
    

    1 - 不看实际代码很难确定。


    或者,正如Jerry Coffin 在他下面的评论中所建议的那样,您可以使用scanf("%*[^\n]");"%*[^\n]" 指令指示 scanf() 匹配不是换行符的内容并禁止分配转换结果。

    /* match up to newline */
    scanf("%*[^\n]"); 
    /* discard the newline */
    scanf("%*c"); 
    

    来自http://c-faq.com/stdio/gets_flush1.html

    带有“%*[^\n]” 的初始scanf() 要么吃掉所有内容,但不包括换行符,或者失败。后续的“%*c”(或普通的旧getchar())将使用换行符,如果有的话。

    最后一个“如果”也很重要:也许用户发出了 EOF 信号。在这种情况下,getchar()scanf("%*c") 可能——这个决定留给编写编译器的人——要么立即返回 EOF,要么返回给用户以获取更多输入。如果实施者选择后者,用户可能需要多点击一次“结束这件事”(^D、^Z、鼠标按钮、前面板开关或其他)。如果没有别的,这很烦人。


    或者,正如Chris Dodd 在他下面的评论中所建议的那样,您可以使用scanf("%*[^\n]%*1[\n]");"%*[^\n]%*1[\n]" 指令指示 scanf() 匹配不是换行符的内容,然后匹配一个换行符并禁止分配转换结果。

    /* match and discard all characters up to and including newline */
    scanf("%*[^\n]%*1[\n]");
    

    【讨论】:

    • 您可以通过scanf("%*[^\n]"); 更轻松地刷新输入缓冲区(即丢弃直到到达换行符)
    • 您可以使用scanf("%*[^\n]%*1[\n]")刷新并包含换行符
    【解决方案3】:

    您可以将这一行放在您的 fgets() 调用之前,这样会在您按下 enter 时生成尾随 '\n'

    scanf("%c", (char *) stdin);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-07
      • 1970-01-01
      • 2020-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-19
      相关资源
      最近更新 更多