Логическая ошибка в цикле Java For - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь продолжить выполнение цикла, пока пользователь не введет букву S на клавиатуре. Кажется, он дает три выхода вместо одного для каждой итерации. Что я тут не так делаю;

// Loop until an S is typed

public class ForTest {

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

        int i;

        System.out.println("Type S to stop.");

        for(i = 0; (char) System.in.read() != 'S'; i++) 
//          System.out.println("print");
            System.out.println("Pass # " + i);
//          System.out.println("print");


    }

}

Выход получится, если я нажму 'a':

Type S to stop.
a
Pass # 0
Pass # 1
Pass # 2

Ответы [ 3 ]

0 голосов
/ 04 июля 2018

Я предлагаю вам не читать вводные данные таким образом, вместо этого используйте Сканер . Вы можете достичь своей цели с помощью этого кода:

    int i = 0;
    Scanner scan = new Scanner(System.in);
    System.out.println("Type S to stop.");
    while( !scan.next().equals("S")) {
        i++;
        System.out.println("Pass # "+i);
    }
0 голосов
/ 04 июля 2018

System.in будет использовать BufferedInputSteam для побитного считывания ввода с консоли (включая разрыв строки и т. Д.). В системе Mac я получаю 2 бита всякий раз, когда я даю однозначный ввод.

Используйте сканер и прочитайте все байты и преобразуйте их в строку.

0 голосов
/ 04 июля 2018

Блок метода InputStream.read до конца ввода, который в ОС Windows является управляющими символами CR LF (\ r \ n).

Это объясняет, почему вы получаете 3 символа в результате.

Убедитесь сами:

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

    int i;

    System.out.println("Type S to stop.");

    char c = (char) 0;
    for (i = 0; c != 'S'; i++) {
        c = (char) System.in.read();
        System.out.println("Pass # " + i);
        System.out.println("char intValue : " + (int) c);
    }
}

Рекомендуется прочитать: Java: как получить данные из System.console ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...