while(getchar()!='\n');

Kon*_*k16 0 c for-loop while-loop getchar

我有以下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??
}
Run Code Online (Sandbox Code Playgroud)

Som*_*ude 5

当您为程序提供输入时,您将使用该Enter键结束它.此密钥将作为换行符发送到您的程序.

循环的作用是在读取换行符之前读取和丢弃字符.它会刷新输入缓冲区.

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

  • 但是有一个问题:只有在遇到换行符`\n`字符时,循环才会终止.对于任何其他事情,它将无限旋转.这显然不是刷新输入缓冲区的正确方法. (4认同)
  • @ Konahrik16是的,你真的需要检查`EOF`.并记住`getchar`返回一个`int`. (3认同)

ex *_*ilo 5

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

int ch;
while ((ch = getchar()) != '\n' && ch != EOF)
    continue;  // discard unwanted characters
Run Code Online (Sandbox Code Playgroud)

另请注意,如果stdin已被重定向,则可以在EOF不遇到\n. 而且,正如@chqrlie 在评论中指出的那样,用户可以EOF通过Ctrl-D在 Linux 或Ctrl-ZWindows 中输入来从终端发出信号。因此,EOF明确测试的重要性。