Экранирующие последовательности

На этом уроке мы будем пользоваться командой print(), а не println(). Отличие команд в том, что println() автоматически добавляет символ переноса строки. В этом уроке мы попробуем расставить переносы строк вручную. Например, мы хотим показать диалог Матери Драконов со своим ребенком:

- Are you hungry?
- Aaaarrrgh!

Если вывести на экран строку с таким текстом:

System.out.print("- Are you hungry?- Aaaarrrgh!");

то получится так:

- Are you hungry?- Aaaarrrgh!

Нам нужно как-то дать команду «нажать на энтер» — сделать перевод строки после вопросительного знака.

В Java \n — это перевод строки:

System.out.print("- Are you hungry?\n- Aaaarrrgh!");

результат:

- Are you hungry?
- Aaaarrrgh!

\n - это пример экранирующей последовательности (escape sequence). Их еще называют управляющими конструкциями.

Набирая текст в каком-нибудь Word вы нажимаете на Enter в конце строчки. Редактор при этом ставит в конец строчки специальный невидимый символ, который называется LINE FEED (LF, перевод строчки). В некоторых редакторах можно даже включить отображение невидимых символов. Тогда текст будет выглядеть примерно так:

- Привет!¶
- О, привет!¶
- Как дела?

Устройство, которое выводит соответствующий текст, учитывает этот символ. Например, принтер при встрече с LF протаскивает бумагу вверх на одну строку, а текстовый редактор переносит весь последующий текст ниже, также на одну строку.

Хотя таких символов не один десяток, в программировании часто встречаются всего несколько. Кроме перевода строки, к таким символам относятся табуляция (разрыв, получаемый при нажатии на кнопку Tab) и возврат каретки (только в Windows). Нам, программистам, часто нужно использовать, например, перевод строки \n для правильного форматирования текста.

System.out.print("Gregor Clegane\nDunsen\nPolliver\nChiswyck");

Внимание! Экранирующие последовательности вроде \n работают только внутри двойных кавычек!

На экран выведется:

Gregor Clegane
Dunsen
Polliver
Chiswyck

В предыдущих уроках для удобства использовался метод System.out.println(), который позволяет вывести на консоль некоторое значение с последующим переводом консоли на следующую строку. Например:

System.out.println("Hello");
System.out.println("World");

На экран выведется:

Hello
World

Обратите внимание на следующие моменты:

1. Не имеет значения, что стоит перед или после \n: символ или пустая строка. Перевод будет обнаружен и выполнен в любом случае.

2. Помните, что строка может содержать лишь один символ или вообще ноль символов? А еще строка может содержать только \n:

System.out.print("Gregor Clegane");
System.out.print("\n");
System.out.print("Dunsen");

Здесь мы выводим одну строку с именем, потом одну строку «перевод строки», а потом еще одну строку. Программа выведет на экран:

Gregor Clegane
Dunsen

3. Несмотря на то, что в исходном тексте программы последовательность типа \n выглядит как два символа, на самом деле это специальный один символ.

4. Если нам понадобится вывести \n в тексте (например, “В Java \n — это перевод строки”), то мы должны добавить еще один символ \ перед \n. Тогда, при выводе, последовательность \\n отобразится в тексте, как символы ‘\’ и ‘n’ идущие друг за другом. В этом случае перевода на новую строку не будет.

System.out.print("Joffrey loves using \\n"); // => Joffrey loves using \n

Такой же подход используют, если нужно вывести текст в двойных кавычках “”: добавляют \ перед символом ".

System.out.print("Joffrey loves using \""); // => Joffrey loves using "

Небольшое, но важное замечание про Windows. В Windows для перевода строк по умолчанию используется \r\n. Такая комбинация хорошо работает только в Windows, но создает проблемы при переносе в другие системы (например, когда в команде разработчиков есть пользователи как Windows, так и Linux). Дело в том, что последовательность \r\n имеет разную трактовку в зависимости от выбранной кодировки (рассматривается позже). По этой причине в среде разработчиков принято всегда использовать \n без \r, так как LF всегда трактуется одинаково и отлично работает в любой системе. Не забудьте настроить ваш редактор на использование \n.

Задание

Напишите программу, которая выводит на экран:

- Did Joffrey agree?
- He did. He also said "I love using \n".

При этом программа использует только один System.out.print(), но результат на экране должен выглядеть в точности как показано выше.


Советы

Определения

  • Экранирующая последовательность — специальная комбинация символов в тексте. Например, \n — это перевод строки.


Нашли ошибку? Есть что добавить? Пулреквесты приветствуются https://github.com/hexlet-basics
Если вы столкнулись с трудностями и не знаете, что делать, задайте вопрос в нашем большом и дружном cообществе
Упражнение доступно только авторизованным пользователям.

Пожалуйста, авторизуйтесь, это необходимо для отслеживания прогресса выполнения уроков. Если у вас ещё нет учётной записи, то сейчас самое время создать аккаунт.