我有以下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??
}
答案 0 :(得分:5)
当您输入程序时,然后使用 Enter 键结束它。此密钥将作为换行符发送到您的程序。
循环的作用是在读取换行符之前读取和丢弃字符。它会刷新输入缓冲区。
如果您不这样做,那么下一个主getchar
调用将返回换行符而不是您期望的数字。
答案 1 :(得分:4)
正如其他人所说,这个循环会丢弃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
的重要性。
答案 2 :(得分:2)
下一行是丢弃用户可能输入的额外字符,以及用户 输入的换行字符。
因此,代码中的其他scanf/getchar
方法不会被此虚假输入污染。
答案 3 :(得分:0)
** while循环的功能是清除用户的非法输入,例如'a','。当它得到'\ n'时,循环结束。
答案 4 :(得分:-1)
while循环用于检查用户何时按Enter键.Enter被视为'\ n'。
答案 5 :(得分:-1)
该行有一段时间,所以在运行时它会重复它直到getchar()==&#39; \ n&#39;。 &#39; \ n&#39;是一个用ASCII表示的字符&#34;输入&#34;键。通过这种方式,您可以测试用户不会按&#34;输入&#34;没有插入数字。