Jump to content

Escape-последовательности в C

В языке программирования C представляет escape-последовательность собой специально разделенный текст в символьном или строковом литерале , который представляет компилятору один или несколько других символов . Это позволяет программисту указывать символы, которые иначе сложно или невозможно указать в литерале.

Escape-последовательность начинается с обратной косой черты ( \ ), называемый escape-символом , а последующие символы определяют значение escape-последовательности. Например, \n обозначает символ новой строки .

Те же или подобные escape-последовательности используются в других родственных языках, таких как C++ , C# , Java и PHP .

Чтобы продемонстрировать значение функции escape-последовательности, чтобы вывести текст Фу в одну строку и На следующей строке код должен вывести новую строку между двумя словами.

Следующий код достигает цели с помощью форматирования текста и жестко запрограммированного значения символа ASCII для новой строки (0x0A). Это ведет себя по желанию со словами в последовательных строках, но escape-последовательность имеет преимущества.

#include <stdio.h>
int main() {
    printf("Foo%cBar", 0x0A);
    return 0;
}

The \n escape-последовательность позволяет сократить код, указав новую строку в строковом литерале, и ускорить выполнение, исключив операцию форматирования текста. Кроме того, компилятор может сопоставить escape-последовательность с системой кодирования символов , отличной от ASCII, и тем самым сделать код более переносимым .

#include <stdio.h>
int main() {
    printf("Foo\nBar");
    return 0;
}

Как это работает

[ редактировать ]

Escape-последовательность меняет способ интерпретации компилятором символьных данных в литерале. Например, \n не представляет собой обратную косую черту, за которой следует буква н . Обратная косая черта позволяет избежать обычного, буквального способа интерпретации символьных данных компилятором. После обратной косой черты компилятор ожидает, что последующие символы завершат одну из определенных escape-последовательностей, а затем преобразует escape-последовательность в символы, которые она представляет.

Этот синтаксис требует специальной обработки для кодирования символа обратной косой черты, поскольку это метасимвол , который меняет поведение буквальной интерпретации; а не буквальный символ обратной косой черты. Проблема решается использованием двух обратных косых черт ( \\ ) означает один.

Escape-последовательности

[ редактировать ]

В следующей таблице приведены escape-последовательности, определенные в стандарте C, а также некоторые нестандартные последовательности. Стандарт C требует, чтобы для диагностики была escape-последовательность, которая не соответствует определенной последовательности, т. е. компилятор должен вывести сообщение об ошибке. Тем не менее, некоторые компиляторы определяют дополнительные escape-последовательности.

В таблице показано значение ASCII, которому соответствует последовательность, однако оно может сопоставляться с другими значениями в зависимости от кодировки.

Escape-последовательность Шестнадцатеричное значение в ASCII Представленный персонаж
07 Оповещение (звуковой сигнал, звонок) (добавлено в C89) [1]
08 Backspace
примечание 1 Побег персонаж
\ е Разрыв страницы
\п Новая строка (перевод строки); см. ниже
0D Возврат каретки
\ т 09 Горизонтальная вкладка
\v Вертикальная вкладка
\\ обратная косая черта
\' 27 Апостроф или одинарная кавычка
\" 22 Двойная кавычка
\? 3эт. Вопросительный знак (используется, чтобы избежать триграфов )
\ ннн примечание 2 ннн (восьмеричный) Байт, числовое значение которого задается nnn, интерпретируется как восьмеричное число.
хх… хх… Байт, числовое значение которого задается hh… интерпретируется как шестнадцатеричное число.
\ ты хххх примечание 3 не-ASCII Юникода Кодовая точка ниже 10000 шестнадцатеричного числа (добавлена ​​в C99) [1] : 26 
хххххх примечание 4 не-ASCII Кодовая точка Юникода, где h — шестнадцатеричная цифра.

^ Нестандартная последовательность \e представляет escape-символ в GCC , [2] лязг и tcc . Он не был добавлен в стандарт C, поскольку не имеет значимого эквивалента в некоторых наборах символов (например, EBCDIC ). [1]

Новая строка

[ редактировать ]

Последовательность \n соответствует одному байту, несмотря на то, что платформа может использовать более одного байта для обозначения новой строки, например, DOS / Windows последовательность CRLF , 0x0D 0x0A . Перевод с 0x0A в 0x0D 0x0A в DOS и Windows возникает при записи байта в файл или на консоль, а обратная трансляция выполняется при чтении текстовых файлов.

Шестигранник

[ редактировать ]

После шестнадцатеричной . escape-последовательности должна идти хотя бы одна шестнадцатеричная цифра \x , без верхней границы; это продолжается до тех пор, пока существует столько шестнадцатеричных цифр. Так, например, \xABCDEFG обозначает байт с числовым значением ABCDEF 16 , за которым следует буква G , который не является шестнадцатеричной цифрой. Однако если полученное целочисленное значение слишком велико, чтобы уместиться в один байт, фактическое назначенное числовое значение определяется реализацией. Большинство платформ имеют 8-битную типы char , что ограничивает полезную шестнадцатеричную escape-последовательность двумя шестнадцатеричными цифрами. Однако шестнадцатеричные escape-последовательности длиной более двух шестнадцатеричных цифр могут быть полезны внутри широкого символа или широкого строкового литерала (с префиксом L):

// single char with value 0x12 (18 decimal)
char s1[] = "\x12";
// single char with implementation-defined value, unless char is long enough
char s1[] = "\x1234";
// single wchar_t with value 0x1234, provided wchar_t is long enough (16 bits suffices)
wchar_t s2[] = L"\x1234";

Восьмеричный

[ редактировать ]

^ Восьмеричная escape - последовательность состоит из обратной косой черты, за которой следуют от одной до трех восьмеричных цифр. Восьмеричная escape-последовательность заканчивается, когда она содержит три восьмеричные цифры или следующий символ не является восьмеричной цифрой. Например, \11 — восьмеричная escape-последовательность, обозначающая байт с десятичным значением 9 (11 в восьмеричном формате). Однако, \1111  — восьмеричная escape-последовательность. \111, за которым следует цифра 1 . Чтобы обозначить байт с числовым значением 1, за которым следует цифра 1 , можно использовать "\1""1" , поскольку C объединяет соседние строковые литералы.

Некоторые трехзначные восьмеричные escape-последовательности слишком велики, чтобы уместиться в один байт. В результате получается значение, определенное реализацией результирующего байта.

Последовательность побега \0 — это широко используемая восьмеричная escape-последовательность, которая обозначает нулевой символ с нулевым значением в ASCII и большинстве систем кодирования.

Универсальные имена персонажей

[ редактировать ]

^ ^ Начиная со стандарта C99 , C поддерживает escape-последовательности, которые обозначают Unicode кодовые точки , называемые универсальными именами символов . Они имеют форму ххх или \U хххххххх , где h означает шестнадцатеричную цифру. В отличие от других escape-последовательностей, универсальное имя символа может расширяться более чем на одну кодовую единицу.

Последовательность \u hhhh обозначает кодовую точку hhhh , интерпретируемый как шестнадцатеричное число. Последовательность \U hhhhhhhh обозначает кодовую точку hhhhhhhh , интерпретируемый как шестнадцатеричное число. Кодовые точки, расположенные по адресу U+10000 или выше, должны обозначаться знаком Синтаксис \U , тогда как более низкие кодовые точки могут использовать \u или . Кодовая точка преобразуется в последовательность кодовых единиц в кодировке типа назначения в целевой системе. Например, если кодировка UTF-8 и UTF-16 для wchar_t :

// A single byte with the value 0xC0; not valid UTF-8
char s1[] = "\xC0";
// Two bytes with values 0xC3, 0x80; the UTF-8 encoding of U+00C0
char s2[] = "\u00C0";
// A single wchar_t with the value 0x00C0
wchar_t s3[] = L"\xC0";
// A single wchar_t with the value 0x00C0
wchar_t s4[] = L"\u00C0";

Значение больше, чем \U0000FFFF может быть представлен одним wchar_t , если используется кодировка UTF-32 , или два, если используется UTF-16.

Главное, универсальное имя персонажа \u00C0 всегда обозначает символ «À», независимо от того, в каком строковом литерале он используется или какая кодировка используется. Восьмеричные и шестнадцатеричные escape-последовательности всегда обозначают определенные последовательности числовых значений, независимо от кодировки. Следовательно, универсальные имена символов дополняют восьмеричные и шестнадцатеричные escape-последовательности; в то время как восьмеричные и шестнадцатеричные escape-последовательности представляют собой кодовые единицы, имена универсальных символов представляют собой кодовые точки, которые можно рассматривать как «логические» символы.

Альтернативы

[ редактировать ]

Некоторые языки предоставляют различные механизмы кодирования поведения, которые обеспечивает escape-последовательность. Например, следующий код Паскаля записывает два слова в последовательные строки:

writeln('Foo');
write('Bar');

writeln выводит новую строку после текста параметра, а писать нет.

См. также

[ редактировать ]
  1. ^ Перейти обратно: а б с «Обоснование международного стандарта — языки программирования — C» (PDF) . 5.10. Апрель 2003 г. Архивировано (PDF) из оригинала 6 июня 2016 г. Проверено 17 октября 2010 г.
  2. ^ «6.35 Символ <ESC> в константах» . GCC 4.8.2 Руководство . Архивировано из оригинала 12 мая 2019 г. Проверено 8 марта 2014 г.

Дальнейшее чтение

[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: a11ced64a9b989364e2b5bb8c306da7b__1712595300
URL1:https://arc.ask3.ru/arc/aa/a1/7b/a11ced64a9b989364e2b5bb8c306da7b.html
Заголовок, (Title) документа по адресу, URL1:
Escape sequences in C - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)