【问题标题】:while (getchar () != '\n' );而 (getchar () != '\n' );
【发布时间】:2017-03-26 01:49:15
【问题描述】:

我有以下 for 循环,提示用户输入 4 位密码并按 Enter。有人可以向我解释一下 while 循环到底在做什么,因为我不完全理解它。

//user input for pin
for(i = 0; i < PIN_LENGTH; i++)
{
    printf("Enter digit %d of your PIN: ", i);
    user_pin[i] = getchar();
    while (getchar() != '\n'); //what is this line doing??
}

【问题讨论】:

  • 它非常糟糕——如果getchar() 得到EOF 会发生什么?
  • @DavidSchwartz 我是 C 新手,我不知道。它有什么作用?
  • 由于未定义的行为而崩溃是我的第一个猜测
  • 它永远循环,因为EOF != '\n',永远不会。

标签: c for-loop while-loop getchar


【解决方案1】:

正如其他人所提到的,此循环丢弃来自stdin 的不需要的字符,以便下一个输入函数具有干净的流,特别是它丢弃用户输入的最后一个字符之后的\n。但是,getchar() 在发生读取错误时返回EOF,因此循环也应该测试EOF,如下所示:

int ch;
while ((ch = getchar()) != '\n' && ch != EOF)
    continue;  // discard unwanted characters

还要注意,如果stdin 已被重定向,则可以在不遇到\n 的情况下到达EOF。而且,正如@chqrlie 在 cmets 中指出的那样,用户可以通过在 Linux 中输入 Ctrl-D 或在 Windows 中输入 Ctrl-Z 从终端发出 EOF 信号。因此,明确测试EOF 的重要性。

【讨论】:

    【解决方案2】:

    当你给程序输入时,你用 Enter 键结束它。此密钥作为换行符发送到您的程序。

    循环所做的是读取并丢弃字符,直到它读取换行符为止。它刷新输入缓冲区。

    如果您不这样做,那么下一个主要的 getchar 调用将返回换行符而不是您期望的数字。

    【讨论】:

    • 但是有一个问题:循环只有遇到换行符\n才会终止。对于其他任何事情,它都会无限旋转。这显然不是刷新输入缓冲区的正确方法。
    • C 参考书说类似 while( (c = getchar()) != '\n' && c != EOF);但在我的情况下,省略 EOF 工作正常。可能是我的侥幸。
    • @Konahrik16 是的,您确实还需要检查EOF。请记住,getchar 返回一个 int
    • @Konahrik16:它似乎工作,因为你没有给你的程序输入会导致它失败:尝试在 linux 或 1control-Zenter 在 Windows 中。
    【解决方案3】:

    下一行是丢弃用户可能输入的可能的额外字符,以及用户必须输入的换行符。

    所以代码中进一步的其他scanf/getchar 方法不会被这个虚假输入污染。

    【讨论】:

      【解决方案4】:

      while 循环用于检查用户何时按下 enter。Enter 被视为 '\n'。

      【讨论】:

        【解决方案5】:

        那一行是一段时间,所以在运行时它会重复它直到 getchar() == '\n'。 '\n' 是一个字符,在 ASCII 中表示“输入”键。通过这种方式,您可以测试用户在没有插入数字的情况下不会按“回车”。

        【讨论】:

          【解决方案6】:

          **这个while循环的作用是清除用户的非法输入,当输入为'\n'时,循环结束。

          【讨论】:

            猜你喜欢
            • 2017-03-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多