【问题标题】:Java do-while loop skipping console input [duplicate]Java do-while循环跳过控制台输入[重复]
【发布时间】:2016-06-05 15:43:33
【问题描述】:
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);
    }
}

格式仍然很糟糕吗?

【问题讨论】:

标签: java do-while system.in


【解决方案1】:

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

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

【讨论】:

  • 啊,这在某处被简单地提到过。为什么它会循环3次?换行符没有单个值,或者为什么它占用 3 个缓冲区“空间”?在这个例子中我将如何使用 bufferedReader?
  • @naike:在某些操作系统(例如 Windows)上,Enter = \r\n,这是两个字符(回车 [char 13] 和换行 [char 10])。回复BufferedReader,查看JavaDoc 并试一试,再次意识到您将得到一个字符串而不是字符的事实。如果您在花费一些时间后遇到问题,请使用您的 BufferedReader 代码发布一个新问题。
  • 谢谢,解决了一些问题,我试试看。
  • 得到它的工作,见第一篇文章。谢谢。
  • @naike:更新这样的问题并不是你应该在 SO 上做的事情。旁注:没有任何理由在每个循环上重新创建 BufferedReader
【解决方案2】:

您一次输入 2 个字符 - 字符本身和一个 '\n' 换行符。用这个替换你读取字符的实现:

Scanner s= new Scanner(System.in);
char x = s.next().charAt(0);

charAt 确保只提取第一个字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    • 2012-09-29
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    相关资源
    最近更新 更多