Есть простой пример кода игры-угадайки.
public class Game {
public static void main(String[] args) throws java.io.IOException {
char ch, ignore;
do {
System.out.print("Введите нужную букву: ");
ch = (char) System.in.read();
do {
ignore = (char) System.in.read();
} while (ignore != '\n');
if (ch == 'a') {
System.out.println("Правильно!");
} else {
System.out.println("Неправильно!");
}
} while(ch != 'a');
}
}
Работает верно, однако если закомментировать
do {
ignore = (char) System.in.read();
} while (ignore != '\n');
То при неверно указанной букве сперва дважды выводится "Введите нужную букву: Неправильно!". Как я понимаю, эта конструкция отбрасывает лишние символы (если, например, ввести вместо 'b' 'bcd'), но почему тогда код срабатывает дважды сам по себе без нее?
System.in.read() считывает только один символ. Но когда вы вводите ответ вы нажимаете букву и клавишу Enter (символ перевода строки). И оба этих символа попадают в поток.
Цикл извлекает из потока все символы, пока не встретит символ перевода строки.
Если цикл убрать, то первый вызов read() прочтет букву, а второй вызов read() прочтет перевод строки.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей