Здравствуйте.
Учу Java 7 по Шилду. Руководство для начинающих.
3 глава, 105 стр.
Вопрос по этому коду:
[syntax=java]// Guess the letter game, 4th version.
class Guess4 {
public static void main(String args[])
throws java.io.IOException {
char ch, ignore, answer = 'K';
do {
System.out.println("I'm thinking of a letter between A and Z.");
System.out.print("Can you guess it: ");
// read a character
ch = (char) System.in.read();
// discard any other characters in the input buffer
do {
ignore = (char) System.in.read();
} while(ignore != '\n');
if(ch == answer) System.out.println("** Right **");
else {
System.out.print("...Sorry, you're ");
if(ch < answer) System.out.println("too low");
else System.out.println("too high");
System.out.println("Try again!\n");
}
} while(answer != ch);
}
}[/syntax]
Не смотря на описание не пойму как это работает:
[syntax=java]
// discard any other characters in the input buffer
do {
ignore = (char) System.in.read();
} while(ignore != '\n');
[/syntax]
В приложении объяснение по книге:
Буферизация консольного ввода (Код из Шилда)
Буферизация консольного ввода (Код из Шилда)
- Вложения
-
- Untitled-2.jpg (62.55 КБ) 2242 просмотра
Re: Буферизация консольного ввода (Код из Шилда)
\n - это символ перевода строки и возврата каретки (нажатие Enter).
Когда что-то вводишь в консоль и нажимаешь Enter, этот символ тоже считывается.
Выглядит примерно так:
Я\n
ищу\n
ответ\n
Этот вложенный цикл посимвольно продолжает бежать по строке пока не встретит \n, поэтому остается только первый символ с каждой строки - Я и о
Без этого цикла первый(внешний) цикл посимвольно считает строки - Я \n и щ у \n о т в е т \n.
Когда что-то вводишь в консоль и нажимаешь Enter, этот символ тоже считывается.
Выглядит примерно так:
Я\n
ищу\n
ответ\n
Этот вложенный цикл посимвольно продолжает бежать по строке пока не встретит \n, поэтому остается только первый символ с каждой строки - Я и о
Без этого цикла первый(внешний) цикл посимвольно считает строки - Я \n и щ у \n о т в е т \n.
Re: Буферизация консольного ввода (Код из Шилда)
Хорошо, попробуем так, вот примитивный код:
[syntax=java]class code {
public static void main(String args[])
throws java.io.IOException {
char ch, ignore;
do {
System.out.print("Enter: ");
ch = (char) System.in.read();
// do {
// ignore = (char) System.in.read();
// } while(ignore != '\n');
System.out.println(ch + " ");
} while (ch!='q');
}
}[/syntax]
Вот его работа:
Т.е. нужно вводить буквы по одной, если введена 'q' - завершение.
Получается когда я ввожу 'w', на самом деле в буфер попадает 'w\r\n' ?
И закомментированный код это очистка буфера?
Т.е.:
1. ignore = \r
2. ignore = \n
При присвоении символов буфер очищается?
[syntax=java]class code {
public static void main(String args[])
throws java.io.IOException {
char ch, ignore;
do {
System.out.print("Enter: ");
ch = (char) System.in.read();
// do {
// ignore = (char) System.in.read();
// } while(ignore != '\n');
System.out.println(ch + " ");
} while (ch!='q');
}
}[/syntax]
Вот его работа:
Код: Выделить всё
Enter: w
w
Enter:
Enter:
Enter:
Получается когда я ввожу 'w', на самом деле в буфер попадает 'w\r\n' ?
И закомментированный код это очистка буфера?
Т.е.:
1. ignore = \r
2. ignore = \n
При присвоении символов буфер очищается?