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