@kosyan4ik1

Почему цикл for делает 2-3 прохода, если инкримент i++?

Дошел в книге вот до такого примера
class help {
	public static void main (String args[])
		throws java.io.IOException{
			int i;
			System.out.println("Для остановки нажмите клавишу S");
		
			for(i = 0; (char) System.in.read() != 'S'; i++)
			System.out.println("проход #" + i);
	}
	}


Но при тесте, получается 3 прохода цикла FOR если вводить любой символ , если просто жать enter цикл выполняется 2 раза, подскажите в чем проблема ? почему так получается?

60489a1b640c6091771289.png
  • Вопрос задан
  • 160 просмотров
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Java
Седой и строгий
Потому что вы вводите по два-три символа. Нажатие клавиши ввода посылает в консоль управляющую последовательность возврата каретки и перевода строки, вот и получается у вас 1\r\n.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
twobomb
@twobomb
Объясняю как это работает, ну как я предполагаю по крайней мере.
Во первых System.in.read читает 1 байт из буфера ввода, во вторых System.in.read блокирует поток пока не появится новый ввод.
Так вот когда вводим 1 и нажимаем ентер, по идее в поток ввода попадают 3 символа 1 - это что мы ввели \r -возврат каретки \n - новая строка, и сначала он считывает 1 байт который занимает символ 1, заходит в цикл выполняет тело, далее он считывает символ возврата каретки и выполняет тело и потом он считывает символ новой строки и выполняет тело, и далее поток опять блокируется в ожидании ввода.
НО! Вот с символом "й" и любой русском буквой не все так однозначно, если стоит кодировка utf8 то в ней он помоему занимает 2 байта, и поэтому должно быть 4 прохода, тоесть сначала он считает первый байт символа й, потом второй байт символа й потом возврат каретки, а потом новую строку. Ну возможно у вас используется например Windows1251 которая поддерживает русские буквы и они занимают там как раз 1 байт и поэтому только 3 прохода вместо 4х
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы