我有以下 for 循环,我提示用户输入 4 位数字 PIN 码并按 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??
}
正如其他人提到的,此循环会丢弃
stdin
中不需要的字符,以便下一个输入函数具有干净的流,特别是它会丢弃用户输入的最后一个字符后面的 \n
。但是,如果发生读取错误,getchar()
将返回 EOF
,因此循环还应该测试 EOF
,如下所示:
int ch;
while ((ch = getchar()) != '\n' && ch != EOF)
continue; // discard unwanted characters
另请注意,如果
stdin
已重定向,则可以在不遇到 EOF
的情况下到达 \n
。并且,正如 @chqrlie 在评论中指出的那样,用户可以通过在 Linux 中输入 EOF
或在 Windows 中输入 Ctrl-D
从终端发出 Ctrl-Z
信号。因此,明确测试 EOF
的重要性。
当您向程序提供输入时,可以使用 Enter 键结束它。该键将作为换行符发送到您的程序。
循环的作用是读取并丢弃字符,直到读取换行符。它刷新输入缓冲区。
如果您不这样做,那么下一个主要
getchar
调用将返回换行符而不是您期望的数字。
下一行将丢弃用户可能输入的额外字符,以及用户已经输入的换行字符。
因此代码中的其他
scanf/getchar
方法不会受到此虚假输入的污染。
在此代码中,您有一个 while 循环,它使用 getchar() 函数从标准输入(通常是键盘)读取字符。只要输入字符不等于换行符 (' ').
这是读取输入的常见方法,直到用户按下“Enter”键,这会生成换行符。一旦遇到换行符,循环就会停止。
while 循环用于检查用户何时按下 Enter。Enter 被视为 ' '。
该行需要一段时间,因此在运行时它将重复直到 getchar() == ' '。 ' ' 是一个字符,在 ASCII 中表示“输入”键。通过这种方式,您可以测试用户在没有插入数字的情况下不会按“Enter”键。
**这个while循环的作用是清除用户的非法输入。当输入为 ' ',循环结束。