为什么println方法中的字符串显示两次?

时间:2018-12-15 13:57:12

标签: java while-loop system.in

在下面的代码中,为什么println方法中的字符串会显示两次,我该怎么做才能在每次迭代中显示一次消息

package practicejava;

public class Query {

    public static void main(String[] args) throws java.io.IOException {
        System.out.println("Guess a capital letter Character");
        while ((char) System.in.read() != 'S') {
            System.out.println("wrong.guess again to finish the program");
        }

    }
}

3 个答案:

答案 0 :(得分:1)

当用户输入控制台字符时,要确认已准备好将其输入传递给应用程序,请按 enter 键。但是,控制台不会仅传递所提供的字符,还会在其后添加到输入流(System.in)与操作系统相关的line separator字符。某些操作系统使用\r\n(这些是单个字符,\x只是表示它们的符号),而其他操作系统,例如Windows,则使用\r\n(两个字符)序列作为行分隔符。

现在,System.in.read()还会读取这些附加字符,由于它们不等于SSystem.out.println("wrong.guess again to finish the program");将执行额外的时间。

为避免此类问题,而不是通过System.in.read()处理原始数据,请考虑使用像java.util.Scanner这样的类,使我们的生活更轻松

Scanner sc = new Scanner(System.in);
System.out.println("Guess a capital letter Character");
String response = sc.nextLine();
while(!response.equals("S")){
     System.out.print("incorrect data, please try again: ");
     response = sc.nextLine();
}

答案 1 :(得分:0)

这是因为您读取的第一个字符是您键入的字母,然后有第二个循环,其中的字符是换行符。

例如,在我的Linux机器上,如果我输入“ E”然后按Enter,则第一个循环处理char 69'E',然后有第二个循环处理回车(char 10)。 / p>

答案 2 :(得分:0)

您可以使用Scanner来获取用户的输入:

package practicejava;

import java.util.Scanner;

public class Query {

    public static void main(String[] args) throws java.io.IOException {
        Scanner s = new Scanner(System.in);
        char c;

        do {
            System.out.println("Guess a capital letter Character");

            c = s.next().charAt(0);

            if (c != 's') {
                System.out.println("Wrong! Guess again to finish the program.");
            }
        } while(c != 's');
    }
}

s.next()将作为字符串从用户那里得到输入,而s.next().charAt(0)将返回该字符串中的第一个字符。