символьная константа: \ 000 \ xhh - PullRequest
10 голосов
/ 16 апреля 2009

Может ли кто-нибудь объяснить, как использовать символьную константу \ 000 и \ xhh, т.е. восьмеричные числа и шестнадцатеричные числа в символьной константе?

Ответы [ 3 ]

5 голосов
/ 16 апреля 2009

В C строки заканчиваются символом со значением ноль (0). Это можно написать так:

char zero = 0;

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

Одной из таких последовательностей является «обратный слеш ноль», который просто означает символ со значением ноль. Таким образом, вы можете написать что-то вроде этого:

char hard[] = "this\0has embedded\0zero\0characters";

В другой последовательности используется обратная косая черта, за которой следует буква 'x' и одна или две шестнадцатеричные цифры для обозначения символа с указанным кодом. Используя этот синтаксис, вы можете записать нулевой байт как, например, '\x0'.

РЕДАКТИРОВАТЬ : Перечитывая вопрос, в восьмой базе также есть поддержка таких констант, то есть восьмеричная. Они используют обратную косую черту, за которой следует цифра ноль, так же, как и восьмеричные литеральные целочисленные константы. '\00', таким образом, является синонимом '\0'.

Это иногда полезно, когда вам нужно создать строку, содержащую непечатаемые символы или специальные управляющие символы.

Существует также набор односимвольных «именованных» специальных символов, таких как '\n' для новой строки, '\t' для TAB и т. Д.

5 голосов
/ 16 апреля 2009

Они будут использоваться для написания непечатных символов в редакторе. Для стандартных символов это будут различные управляющие символы, для wchar это могут быть символы, не представленные в шрифте редактора.

Например, это компилируется в Visual Studio 2005:

    const wchar_t bom = L'\xfffe';     /* Unicode byte-order marker */
    const wchar_t hamza = L'\x0621';   /* Arabic Letter Hamza */
    const char start_of_text = '\002'; /* Start-of-text */
    const char end_of_text = '\003';   /* End-of-text */

Edit: использование восьмеричных литералов символов имеет интересную оговорку. Восьмеричное число может быть длиной не более трех цифр, что искусственно ограничивает символы, которые мы можем ввести.

Например:

        /* Letter schwa; capital unicode code point 0x018f (octal 0617)
         *               small unicode code point   0x0259 (octal 1131) 
         */
    const wchar_t Schwa2 = L'\x18f';    /* capital letter Schwa, correct */
    const wchar_t Schwa1 = L'\617';     /* capital letter Schwa, correct */
    const wchar_t schwa1 = L'\x259';    /* small letter schwa, correct */
    const wchar_t schwa2 = L'\1131';    /* letter K (octal 113), incorrect */
3 голосов
/ 16 апреля 2009

Восьмеричное число - это основание 8 (с использованием цифр 0-7), поэтому каждая цифра состоит из 3 битов:

\ 0354 = 11 101 100

Шестнадцатеричное - это основание 16 (с использованием цифр 0-9, A-F), а каждая цифра - 4 бита:

\ x23 = 0010 0011

Внутри строк C (массивы / указатели символов) они обычно используются для кодирования байтов, которые трудно представить.

Итак, если вам нужна строка, которая использует ASCII-коды, такие как STX и ETX, вы можете сделать:

char *msg = "\x02Here's my message\x03";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...