Почему строка внутри метода println отображается дважды? - PullRequest
0 голосов
/ 15 декабря 2018

В следующем коде почему строка внутри метода 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 голосов
/ 15 декабря 2018

Это потому, что первым прочитанным вами символом является введенная вами буква, а затем есть второй цикл, в котором символом является возвращаемая строка.

Например, на моем компьютере с Linux, если я введу "E""и затем нажмите клавишу ввода, первый цикл обрабатывает символ 69 'E', а затем есть второй цикл для обработки возврата каретки (символ 10).

0 голосов
/ 15 декабря 2018

Что вы можете сделать, это использовать 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) вернет первый символв этой строке.

0 голосов
/ 15 декабря 2018

Когда пользователь пишет в консольных символах, для подтверждения того, что его ввод готов к передаче в приложение, он нажимает клавишу enter .Но консоль не передает только предоставленные символы, она также добавляет к входному потоку (System.in) зависящий от ОС разделитель строк символов после нее.Некоторые ОС используют \r или \n (это одиночные символы, \x - просто обозначение для их представления), другие, например, Windows, используют последовательность \r\n (два символа) в качестве разделителя строк.

Теперь эти дополнительные символы также считываются System.in.read(), и поскольку они не равны S System.out.println("wrong.guess again to finish the program");, выполняется дополнительное время.

Чтобы избежать таких проблем, вместо работы с rawданные через 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();
}
...