stringtranslate.com

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

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

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

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

Ценить

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

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

#include <stdio.h> int main () { printf ( «Foo%cBar» , 0x0A ); вернуть 0 ; }       

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

#include <stdio.h> int main () { printf ( «Foo \n Bar» ); вернуть 0 ; }      

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

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

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

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

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

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

Побег

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

Новая линия

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

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

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

// одиночный символ со значением 0x12 (18 десятичных знаков) char s1 [] = " \x12 " ; // одиночный символ со значением, определяемым реализацией, если только символ не имеет достаточной длины char s1 [] = " \x1234 " ; // одиночный wchar_t со значением 0x1234, при условии, что wchar_t достаточно длинный (достаточно 16 бит) wchar_t s2 [] = L " \x1234 " ;         

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

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

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

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

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

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

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

// Один байт со значением 0xC0; недопустимый символ UTF-8 s1 [ ] = " \xC0 " ; // Два байта со значениями 0xC3, 0x80; кодировка UTF-8 U+00C0 char s2 [] = " \u00C0 " ; // Одиночный wchar_t со значением 0x00C0 wchar_t s3 [] = L " \xC0 " ; // Одиночный wchar_t со значением 0x00C0 wchar_t s4 [] = L " \u00C0 " ;            

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

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

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

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

writeln ( 'Фу' ) ; написать ( 'Бар' ) ;

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

Смотрите также

Рекомендации

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

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