Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java输入缓冲区和do while循环行为(为什么它会检查第一个字符3次?)_Java_Loops_Do While_Input Buffer - Fatal编程技术网

Java输入缓冲区和do while循环行为(为什么它会检查第一个字符3次?)

Java输入缓冲区和do while循环行为(为什么它会检查第一个字符3次?),java,loops,do-while,input-buffer,Java,Loops,Do While,Input Buffer,我一直在用Oracle的“Java初学者指南”学习Java,在理解书中关于输入缓冲区和do-while循环的示例程序时遇到了困难 这个例子是关于一个数字猜测程序。它被设计为忽略您可能输入的任何额外字符。因此,如果您输入ABC,然后按enter键,它将只选中A 我的问题更多的是关于输入缓冲区,如果我注释掉处理忽略的第二个do while循环,然后运行程序,它会检查该单个字符3次。因此,如果我输入一个“a”,然后按enter键,它似乎会检查3次,我会得到“…对不起,你太低了”的输出模糊3次 如果我输

我一直在用Oracle的“Java初学者指南”学习Java,在理解书中关于输入缓冲区和do-while循环的示例程序时遇到了困难

这个例子是关于一个数字猜测程序。它被设计为忽略您可能输入的任何额外字符。因此,如果您输入ABC,然后按enter键,它将只选中A

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

如果我输入'AZ',然后按enter键,它似乎会检查4次,然后检查A,然后检查Z,然后再检查A 2次


问题:

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

  • 如果enter键实际指定忽略,\n我有点困惑?或者它只是在等待,直到没有更多的字符可以分配给忽略?书中说按下回车键会产生换行符。因此,当:(ignore!='\n')时,do while循环终止

    谢谢你的帮助

    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);
            }
    }
    
    class猜测4{
    公共静态void main(字符串参数[])
    抛出java.io.IOException{
    char ch,ignore,answer='K';
    做{
    System.out.println(“我在想a和Z之间的一个字母”);
    System.out.println(“你能猜出来吗?”);
    //读一个字
    ch=(char)System.in.read();
    /*丢弃输入缓冲区中的任何其他字符
    做{
    ignore=(char)System.in.read();
    }while(忽略!='\n');
    */
    if(ch==answer)System.out.println(“**右**”);
    否则{
    System.out.print(“…对不起,您是”);
    if(ch
    问题1:

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

    第一个字符被多次检查的假设是错误的。要进行简单调试,请打印要测试的字符:

    // ...
    System.out.println("Now checking: '" + ch + "''");
    if(ch == answer) System.out.println("**Right**");
    // ...
    
    现在,当您输入
    abc[enter]
    时,您将看到每个字符都被单独处理,并且每个字符都会产生相同的消息。此外,还对新行进行了测试

    问题2:

    你完全正确

    不过有一件很重要的事情:第二个do while构造的全部要点是清除输入流,以便进行下一次猜测! 这就是上面的注释至少试图指出的:
    丢弃输入缓冲区中的任何其他字符。检查换行符只是为了让您知道您可以退出循环,因为一次猜测仅限于一行!实际上你根本不需要那个忽略变量。通过读取该字符,将其从流中删除。因此,它是关于通过调用
    System.in.read()
    来读取本身的-您不必将结果分配给任何东西

    您可以将第二个do while循环替换为
    do{}while(System.in.read()!='\n')

    您确定吗?三次?当我运行它时,一切都按预期进行:如果只输入A,则会看到两行,因为第一行是A,然后是“\n”。对于ABC,您将看到4行:每个字符一行,而“\n”一行。在if子句前面添加
    System.out.println(“现在检查:”+ch+”)查看发生了什么。@我想我得到3的原因是因为我使用了命令行。我用IntelliJ尝试了相同的代码,结果只得到2。添加代码后,额外的响应奇怪地只输出“w checking:”。书中说,按Enter键会导致回车和换行顺序。这第三个输出是回车吗?据我所知,回车键将光标移动到其左起点,而/n将光标向下移动一行。这可能解释了奇怪的第三次输出。下面是用命令行输入ABC(4个响应):我建议在代码中测试类似的理论:
    if(ch='\r'){…}
    。请记住,许多字符不能通过打印来识别谢谢,事实证明我收到的额外回复确实是来自回车谢谢,这就清楚了很多。我不知道您可以将\n这样的值分配给char。我回复了你上面的评论,但基本上我使用的是命令行,这似乎就是为什么我会得到额外的响应/运行。以下是进入ABC并获得4条回复的屏幕截图:。注意奇怪的“w检查:”输出,我怀疑可能是回车?(w前面的“实际上是两个”)。你在使用windows吗?因为在windows中,换行符是通过发送两个转义序列来表示的:
    \r
    ,后跟
    \n
    …编辑:刚才看到了你上面的评论。。。