Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/25: Рейтинг темы: голосов - 25, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 15.11.2014
Сообщений: 20

Отбросить все ненужные символы при вводе с клавиатуры

21.11.2017, 01:04. Показов 5191. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всех приветствую!
Пытаюсь разобраться в нижеприведенном тривиальном коде - как бы игра: загадана латинская буква от а до z и необходимо её угадать. Помогите разобраться.

Абсолютно не могу понять как работает следующий фрагмент:
Java
1
2
3
do {
            ignore = (char) System.in.read();
           } while(ignore != '\n');
Он вроде как предназначен, чтобы отбросить все лишние символы вводимые с клавиатуры, если например вводится не одна буква,например, K, а KOUIHY. т.о. OUIHY будет отброшено и останется только К.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Guess4 {
   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("** ВЕРНО**");
           else {
              System.out.print(" НЕВЕРНО. Нужная буква находится ");
              if(ch < answer) System.out.println("ближе к концу");
              else System.out.println("ближе к началу");
              System.out.println("Try again!\n");
           }
        } while(answer != ch);
     }
  }
 
Код взят из книги Java 8_Руководство для начинающих, Шилдт, стр. 109
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.11.2017, 01:04
Ответы с готовыми решениями:

Отбросить ненужные символы при вводе
Здравствуйте! Задача. Введите строку &quot;characters&quot; стандартного входного устройства. Сохраните строку в массиве символов s. Отбросьте...

Как вводить символы с клавиатуры на консоль, чтобы при вводе они шифровались?
Как вводить символы с клавиатуры на консоль, чтобы при вводе они шифровались (вместо символа изображались ***)?

При вводе символов/букв в textbox с клавиатуры, нужно в место них выводить рандомно символы из массива
Есть массив букв. При вводе символов/букв в textbox с клавиатуры, нужно в место них выводить рандомно символы из массива. public char...

18
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
21.11.2017, 06:07
Дебаггер запусти, или например принтлн в цикл добавь
0
 Аватар для Aviz__
2748 / 2056 / 508
Регистрация: 17.02.2014
Сообщений: 9,483
21.11.2017, 10:23
Maximus005, метод read() читает из потока ввода в буфер определенной длинны вместе с символом '\n'.
Непонятный вам код, освобождает буфер, до символа перевода строки. Попробуйте убрать этот код из программы и введите несколько символов.
0
958 / 577 / 136
Регистрация: 23.05.2012
Сообщений: 7,364
21.11.2017, 11:27
Java
1
2
3
do {
  ignore = (char) System.in.read();  //считать символ (и ничего с ним не делать)
} while(ignore != '\n');                   //если этот символ не перевод строки, то повторить цикл
Цитата Сообщение от Maximus005 Посмотреть сообщение
KOUIHY т.о. OUIHY будет отброшено и останется только К
Верно.
0
 Аватар для Aviz__
2748 / 2056 / 508
Регистрация: 17.02.2014
Сообщений: 9,483
21.11.2017, 12:17
в буфере останется только '\n'. по их количеству можно определить сколько раз пользователь пытался угадать нужный символ.
0
958 / 577 / 136
Регистрация: 23.05.2012
Сообщений: 7,364
21.11.2017, 12:41
Aviz__, сначала считываем, потом проверяем. Почему в буфере останется '\n'?
0
 Аватар для Aviz__
2748 / 2056 / 508
Регистрация: 17.02.2014
Сообщений: 9,483
21.11.2017, 12:50
Цитата Сообщение от JIeIIIa Посмотреть сообщение
while(ignore != '\n');
поэтому
0
958 / 577 / 136
Регистрация: 23.05.2012
Сообщений: 7,364
21.11.2017, 13:11
Aviz__, при каком значении ignore цикл завершит работу?
0
0 / 0 / 0
Регистрация: 15.11.2014
Сообщений: 20
21.11.2017, 16:40  [ТС]
Aviz__, Спасибо за отклик.
Да, понятно ЧТО делает этот кусочек кода, но не понятно КАК. Я и println вставлял (как советовал автор выше) и убирал этот код и смотрел как будет вести себя прога.

Java
1
ch = (char) System.in.read();
- вот здесь, как я понимаю, программа ожидает ввода символа с клавиатуры и записывает соответствующий код в переменную ch.
По идее вот здесь
Java
1
2
3
do {
 ignore = (char) System.in.read();
 } while(ignore != '\n');
должно происходить тоже самое - я должен повторно ввести символ, но вместо этого прога никакого ввода от меня не ждет а просто выполняется цикл и каким-то образом удаляет ненужные символы.

Хмм, таким образом возникает два, вроде бы четких вопроса:
1) как вы считаете, почем всё-таки в том самом непонятном кусочке кода прога не ждет от меня ввода символа ?
2) и каким всё-таки образом этот кусочек кода удаляет ненужные символы ? как говорится: в чем физика этого процесса?)
0
958 / 577 / 136
Регистрация: 23.05.2012
Сообщений: 7,364
21.11.2017, 17:08
Цитата Сообщение от Aviz__ Посмотреть сообщение
read() читает из потока ввода в буфер определенной длинны вместе с символом '\n'
В классе System
Java
1
public final static InputStream in
В InputStream метод read():
Java
1
public abstract int read() throws IOException;
Aviz__, за раз считывает один символ. О каком буфере Вы говорили?
Цитата Сообщение от Aviz__ Посмотреть сообщение
в буфере останется только '\n'
Не верно!

Maximus005, если не хотите пользоваться дебаггером, то чуть изменил программу. Смотрите на вывод
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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();
            System.out.println("Был считан символ '"+ch+"'");
            System.out.println("1 Начало цикла по пропуску символов");
            do {
                ignore = (char) System.in.read();
                if (ignore != '\n') {
                    System.out.println("1.1 В цикле Был считан символ '" + ch + "'. Данный символ будет пропущен!");
                } else {
                    System.out.println("1.2 В цикле Был считан символ '\\n'. Данный символ будет пропущен!");
                }
 
            } while(ignore != '\n');
            System.out.println("2 Цикла по пропуску символов закончен");
 
            if(ch == answer) System.out.println("** ВЕРНО**");
            else {
                System.out.print(" НЕВЕРНО. Нужная буква находится ");
                if(ch < answer) System.out.println("ближе к концу");
                else System.out.println("ближе к началу");
                System.out.println("Try again!\n");
            }
        } while(answer != ch);
    }
Цитата Сообщение от Maximus005 Посмотреть сообщение
удаляет ненужные символы
Да не удаляет же. Вы в консоле вводите строку (возможно больше обного символа). Ввод завершается нажатием клавиши Enter. Тогда Ваша сторока будет состоять из видимых символов и в конце будет символ перевода строки '\n'. Ваша программа считывает первый символ. Далее в цикле считывает символы (считывает в переменную ignore), пока не будет считан символ '\n'. Далее выводится ответ.

Цитата Сообщение от Maximus005 Посмотреть сообщение
ожидает ввода символа с клавиатуры
Если не осталось несчитанных символов, то ожидает. Иначе считывает первый несчитанный символ.
0
 Аватар для Aviz__
2748 / 2056 / 508
Регистрация: 17.02.2014
Сообщений: 9,483
21.11.2017, 18:39
поле in имеет тип InputStream, откуда вызывается метод read(), читаем его описание:
"Reads some number of bytes from the input stream and stores them into the buffer array...".
JIeIIIa, сделайте так while(ignore != 's'); и введите строку qwesdfg ну, и пошаговую трассировку. Где теперь она запрашивает новый символ?

Добавлено через 3 минуты
Цитата Сообщение от JIeIIIa Посмотреть сообщение
в буфере останется только '\n'
Не верно!
Да, все же гляньте содержание буфера))
0
958 / 577 / 136
Регистрация: 23.05.2012
Сообщений: 7,364
21.11.2017, 18:47
Aviz__, read
Oracle с Вами не согласен.
public abstract int read()
throws IOException
Reads the next byte of data from the input stream. The value byte is returned as an int in the range 0 to 255. If no byte is available because the end of the stream has been reached, the value -1 is returned. This method blocks until input data is available, the end of the stream is detected, or an exception is thrown.
Возвращаемый тип int как бы намекает что будет считано одно значение, а не буфер.

Цитата Сообщение от Aviz__ Посмотреть сообщение
сделайте так
Выше выкладывал код. Вводите строку (любую, но длинней одного символа) и смотрите как работает.
0
 Аватар для Aviz__
2748 / 2056 / 508
Регистрация: 17.02.2014
Сообщений: 9,483
21.11.2017, 19:00
JIeIIIa, знать истина многогранна)). Это ваш выбор, смотреть буфер или нет.
0
958 / 577 / 136
Регистрация: 23.05.2012
Сообщений: 7,364
21.11.2017, 19:23
Aviz__, для Вас когда в цикле ожидается ввод s:

Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static void main(String args[])
            throws java.io.IOException {
        char ch, ignore, answer = 'K';
        do {
            System.out.print("Input string: ");
 
            ch = (char) System.in.read();
            System.out.println("was read '"+ch+"'");
 
            System.out.println("start do-while");
            int count = 0;
            do {
                ignore = (char) System.in.read();
                count++;
            } while(ignore != 's');
            System.out.println("finish end-while (with " + count + " steps");
            
        } while(answer != ch);
    }

Результат:
Code
1
2
3
4
5
6
Input string: kfjghsToighK
was read 'k'
start do-while
finish end-while (with 5 steps
Input string: was read 'T'
start do-while
1шаг основного цикла: Прочитали первый символ. Далее в цикле do-while происходит считывание посимвольно того, что есть во входящем потоку. Встретили символ s - вышли из цикла do-while. Данный цикл был выполнен 5 раз. Таким образом после k было пропущено 5 символов (и s в том числе).
2шаг основного цикла: Так как во входящем потоке есть символы, то сразу считывается первый символ во входящем потоке - это символ T. Опять выполняем цикл do-while. Так как среди оставшихся не считанных символов нет s, то цикл вычитает все что осталось (посимвольно) и будет ожидать следующего ввода. Именно поэтому видна строка "start do-while", но нет строки "finish do-while".

Цитата Сообщение от Aviz__ Посмотреть сообщение
смотреть буфер
Где Вы какие буферы увидели? Объясните, пожалуйста.
0
 Аватар для Aviz__
2748 / 2056 / 508
Регистрация: 17.02.2014
Сообщений: 9,483
22.11.2017, 09:36
Цитата Сообщение от Aviz__ Посмотреть сообщение
Reads some number of bytes from the input stream and stores them into the buffer array.
Искренне пытался объяснить, но увы((. Причем, это может быть, и мое корявое объяснение, а может, и нет...
0
502 / 348 / 134
Регистрация: 14.06.2016
Сообщений: 669
22.11.2017, 09:51
Aviz__, а может ты не прав.
0
 Аватар для Aviz__
2748 / 2056 / 508
Регистрация: 17.02.2014
Сообщений: 9,483
22.11.2017, 10:16
vcrop, Жаль, что вы "тыкаете", искренне жаль вас.
Так я и писал, что есть приемник и источник информации... кто-то сбоит)).
0
958 / 577 / 136
Регистрация: 23.05.2012
Сообщений: 7,364
22.11.2017, 12:27
Цитата Сообщение от Aviz__ Посмотреть сообщение
Reads some number of bytes from the input stream and stores them into the buffer array.
Это описание для метода int read(byte[] b). А в коде используется int read(). И это разные методы. С чем Вы пытаетесь спорить?
Уже менял программу так, как Вы говорили и описывал по шагам как она работает))) Прокомментируйте, пожалуйста, почему получается именно такой вариант вывода:
Цитата Сообщение от JIeIIIa Посмотреть сообщение
Input string: kfjghsToighK
was read 'k'
start do-while
finish end-while (with 5 steps
Input string: was read 'T'
start do-while
0
 Аватар для Aviz__
2748 / 2056 / 508
Регистрация: 17.02.2014
Сообщений: 9,483
22.11.2017, 13:18
Цитата Сообщение от JIeIIIa Посмотреть сообщение
пытаетесь спорить?
даже не думал)).
Увы, по другому объяснить не получается((. Очевидно, мы не понимаем друг друга! И при этом вам, или мне это в жизни аукниться, тогда и поймем истину...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.11.2017, 13:18
Помогаю со студенческими работами здесь

Заменить все ненужные символы внутри квадратных скобок
Привет, друзья! Никак не удаётся подобрать работающие выражение. Пытаюсь убрать ненужный текст внутри скобок. Сейчас у меня такое:$text =...

Создаю калькулятор. Нужно, чтобы при вводе в textbox чего-нибудь, кроме чисел, все символы меняли цвет
Создаю калькулятор. Нужно, чтобы при вводе в textbox чего-нибудь, кроме чисел, все символы меняли цвет. Язык программирования: C#

Ненужные символы при записи в файл
Добрый день! Столкнулся с такой проблемой: создаю в программе новый файл и пытаюсь записать туда строку. потом сразу вывожу то,что...

Составить программу, которая при вводе символа с клавиатуры выво-дит "латинская буква" при вводе латинской буквы и "не латинская бук-ва" во всех остал
Составить программу, которая при вводе символа с клавиатуры выво-дит &quot;латинская буква&quot; при вводе латинской буквы и &quot;не латинская...

Если длина строки больше заданной, отбросить первые символы, иначе в её начало добавить символы "."
Дано целое число N (N&gt;0) и строка S.Преобразовать строку S в строку длины N следующим образом:если длина строки S больше N,то отбросить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru