3

我一直在通过 Oracle 的“Java A Beginner's Guide”学习 Java,并且无法理解书中有关输入缓冲区和 do-while 循环的示例程序。

这个例子是关于一个数字猜测程序。它旨在忽略您可能输入的任何额外字符。所以如果你输入 ABC 然后按回车它只会检查 A。

我的问题更多关于输入缓冲区,如果我注释掉处理忽略的第二个 do-while 循环然后运行程序,它会检查该单个字符 3 次。因此,如果我输入一个“A”,然后按回车键,它似乎检查了 3 次,我得到了 3 次“......对不起,你太低了”输出信息。

如果我输入“AZ”然后按回车,它似乎检查了 4 次,它先检查 A,然后再检查 Z,然后再检查 A 2 次。


问题:

  1. 为什么似乎总是检查第一个字符 3 次?
  2. 回车键是否将 \n 分配给忽略变量?
    当没有注释掉第二个 do-while 循环时,如果输入 ABC 然后按回车,这是正确的顺序吗?
    A – 分配给 ch
    B- 分配给忽略
    C- 分配给忽略
    Enter 键 (\n) – 分配给忽略,循环退出,因为分配了忽略 \n

如果回车键实际上指定 \n 忽略,我有点困惑?还是只是等到没有更多字符可以分配忽略?书中说按回车会导致换行。因此,do-while 循环在以下情况下终止:(ignore != '\n')。

谢谢你的帮助!

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

            char ch, ignore, answer = 'K';

            do {
                System.out.println("I'm thinking of a letter between A and Z.");
                System.out.println("Can you guess it: ");

                //read a character
                ch = (char) System.in.read();

                /* discard any other characters in the input buffer
                do {
                    ignore = (char) System.in.read();
                } while(ignore != '\n');
                */

                if(ch == answer) System.out.println("**Right**");
                else {
                    System.out.print("...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);
        }
}
4

1 回答 1

0

问题一:

(正如我已经在评论中写的那样,如果我只输入一个字符,我没有得到 3 行,我得到了 2,这是正确的行为)

您多次检查第一个字符的假设是错误的。为了简单的调试,打印将被测试的字符:

// ...
System.out.println("Now checking: '" + ch + "''");
if(ch == answer) System.out.println("**Right**");
// ...

现在,当您输入 时abc[enter],您将看到每个字符都是单独处理的,并且每个字符都会导致相同的消息。还测试了换行符。

问题2:

你是绝对正确的。

但是有一件重要的事情:第二个 do-while 构造的重点是清除输入流以供您下一次猜测!这就是上面的评论至少试图指出的:discard any other characters in the input buffer。检查换行符只是为了让您知道您可以退出循环,因为一次猜测仅限于一行!实际上,您甚至根本不需要那个忽略变量。通过读取字符从流中删除。所以它是关于通过调用读取本身的System.in.read()- 你不必将结果分配给任何东西。

你可以用 just 替换第二个 do-while 循环 do {} while(System.in.read() != '\n');

于 2019-08-06T22:02:12.590 回答