JAVA: 嵌套的 do-while 循环如何丢弃输入缓冲区中的字符?

JAVA: How can a nested do-while loop discard characters from the input buffer?

我正在研究 Oracle 的 "Java: A Beginner's Guide",我被关于使用嵌套的 do-while 循环的小节难住了。给出的示例创建了一个简单的猜谜游戏,用户在其中输入 A 和 Z 之间的字母。如果他猜对了程序 returns "Right",否则将执行附加代码并给出提示——它要么returns "too high" 或 "too low".

作者声明他正在使用嵌套的 do-while 循环 "discard any other characters in the input buffer"。

当我运行没有嵌套do-while的程序时,无论我输入的字符大于正在搜索的答案还是小于正在搜索的答案,程序总是评估它小于答案。当我 运行 带有嵌套 do-while 的程序时,程序 运行 正确。

我的问题: 我不明白嵌套的 do-while 是如何影响程序的其余部分的。什么是嵌套的 do-while 执行而外部的 do-while 不是?

代码如下:

class Application {
    public static void main(String[] args)
    throws java.io.IOException {

        char ch, ignore, answer = 'K';

        do {
            System.out.println("I'm thinking of a number between A and Z");
            System.out.println("Can you guess it: ");
            ch = (char) System.in.read();


            do {
                ignore = (char) System.in.read();
            } while(ignore != '\n');

            if(ch == answer) System.out.println("Right");
            else {
                System.out.println("Sorry, you're ");
                if(ch < answer) System.out.println("too low.");
                else System.out.println("too high.");
                System.out.println("Try again!\n");
            }
        } while(answer != ch);
    }
}

内部do-while读取一个字符,将其与换行符进行比较;如果不是换行符,则读取下一个字符。如果输入abcde,'a'会在var中结束ch(由于在外层do循环中读取),bcde会全部被丢弃,换行符会终止内层循环。

如果您想要分析特定输入,请提供输入。

内部的 do-while 仅用于确保您正在读取输入的第一个字符,而不是更多。因为如您所见,它开始一个字符一个字符地读取,直到找到 '\n',这就像按 "Enter"。因此,程序将停止读取您的输入(或者更好的是,将为将来的输入清除缓冲区)并且比较的输入将是真实的。