lamerizhottabicha
@lamerizhottabicha
Начинающий программист Java и дизайнер

Почему цикл do-while работает странно?

Вопрос крайне простой.
Я хочу сделать так, чтобы программа не останавливалась пока загаданная буква не будет угадана.
Почему нижеследующий код выводит несколько строк "Угадайте букву от A-Z: ", вместо одной?

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

        char ch;
        do {
            System.out.print("Угадайте букву от A-Z: ");
            ch = (char) System.in.read(); //считываем символ
        } while (ch != 'Q');
    }
}


Результат программы:
Угадайте букву от A-Z: f
Угадайте букву от A-Z: Угадайте букву от A-Z: Q
<- две строки почему-то

Странность заключается в том, что абсолютно аналогичный пример работает. Хотелось бы детального разбора.
Второй пример:

public class HelloWorld {
    public static void main(String[] args)
            throws java.io.IOException {
        char ch, ignore, answer = 'K';

        do {
            System.out.println("Загадана буква от A-Z");
            System.out.print("...попробуйте ее угадать ");

            ch = (char) System.in.read();

            do {
                ignore = (char) System.in.read();
            } while (ignore != '\n');

            if (ch == answer) System.out.println("***right***");
            else {
                System.out.println("Извините, не правильно :(");
                if (ch < answer) System.out.println("Буква ближе к концу алфавита");
                else System.out.println("Буква ближе к началу алфавита");
            }
        } while (answer != ch);
    }
}
  • Вопрос задан
  • 173 просмотра
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
1. in.read() читает один байт.
2. Введённые вами f и ВВОД остаются в буфере.
3. Данные передаются в поток, когда вы нажтмаете ВВОД.
Потому первый раз читает f, второй раз — забуферизированный ВВОД.
Используйте java.util.Scanner, который позволит считывать строчку целиком.
Или, на худой конец, пропустите забуферизированные байты System.in.skip(System.in.available());
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Elxanjv_1
@Elxanjv_1
Do -выполняет потом проверяет с помощью while
While-проверяет потом выпоняет
Ответ написан
Комментировать
@Deiwan
Если память мне не изменяет, то (1 код) в do while сначала используется блок do, a потом while, а так как у тебя в do выведение, поетому и два раза
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Bell Integrator Хабаровск
До 400 000 ₽
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽