Java do-while 循环跳过控制台输入

标签 java do-while system.in

<分区>

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

        char ch, answer;
        answer = 'g';

        do {
            System.out.println("Guess from A-L:");
            ch = (char) System.in.read();
                if(ch == answer){
                    System.out.println("Congratz!");
            } else System.out.println("Try again!");
        } while (ch != answer);
    }
}

输出是这样的:

Guess from A-L:
a
Try again!
Guess from A-L:
Try again!  // this is where intuitively it should ask for input again
Guess from A-L:
Try again!
Guess from A-L:
g           //  input is skipped a few times
Congratz!

我不明白为什么,我正在读一本面向初学者的书,应该涵盖所有内容,我错过了什么?

在循环末尾添加下面的代码确认它正在循环但输入以某种方式被跳过。

i++;
System.out.println(i);

所以我用这个让它工作:

import java.io.*;

class Noob1 
{
    public static void main(String args[]) throws java.io.IOException
    {
        char ch, answer;
        String tmp;
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        answer = 'g';

            do 
            {
                System.out.println("Guess character followed by ENTER:");
                tmp = bufferedReader.readLine();
                ch = tmp.charAt(0); // only first char is considered
                if (ch == answer) 
                    System.out.println("Gratz! the answer was: " + ch + "!");
                else 
                    System.out.println("Nope, try again..");
            } while (ch != answer);
    }
}

格式仍然很糟糕吗?

最佳答案

read 只读取一个字符,但在回答时,您输入了多个字符:您输入的是 a 后跟一个换行符,因为在您按 Enter 之前,控制台输入不会发送到流。该换行符位于流中,等待下一个 read 读取,这就是为什么它不等待您再次键入内容的原因。

您可能希望将 System.in 包装在 BufferedReader 中并使用 BufferedReader#readLine并处理你得到一个字符串而不是一个字符的事实,或者在得到你的字符之后,重复调用 read 直到你得到换行符。我会选择 bufferedReader

关于Java do-while 循环跳过控制台输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37643738/

相关文章:

java - 为什么我在使用 Pattern 类来识别字符串是否有效时出现错误?

java - 简单的 ServiceLoader - java.util.ServiceConfigurationError ... 提供者 ... 未找到

c++ - do-while 循环的哪个例子?

c++ - do-while 语句主体中的声明范围

java - 如何使多个基于文本的 java 菜单工作?

java - 在飞溅 Activity 中按下后退按钮时如何完成其​​他 Activity ?

java - 在 Android 中向日历添加一天在 31 日失败

php - 为什么 echo 在 do while 循环中甚至在 ignore_user_abort(1) 时都不起作用?

java - BufferedReader 卡在最后一个输入行而没有结束程序

java - 为 System.in 设置环境