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中表示“输入”键的字符。 通过这种方式,您可以测试用户在没有插入数字的情况下不会按“输入”。