Нормальные символы рядом с ASCII экранируются в строках C

Я пишу программу на C для конкретной нестандартной платформы, и мне нужно распечатать строку, которая содержит расширенные коды ASCII для рисования текстового интерфейса. Тем не менее, мне нужно было распечатать строки, как показано ниже:

"\xCDBaby  \xCD"

а также

"\xDFEDWARD\xDF"

Цель состоит в том, чтобы распечатать слова "Baby" и "EDWARD" с расширенными байтами ASCII на каждом конце. К сожалению, компилятор C интерпретирует их как экранирование многобайтовых символов, так как он обрабатывает B и a в "Baby" и E и D в "EDWARD" как шестнадцатеричные цифры, которые задают значение многобайтового символа, вместо экранирования однобайтового символа, за которым следует по обычному тексту. Есть ли способ отделить escape от реального символа, например, незначный escape для обозначения конца шестнадцатеричного числа? Прямо сейчас мой обходной путь состоит в том, чтобы вставить "%c" и использовать форматирование printf платформы, чтобы поместить туда правильное значение, но это ненормально и должен быть лучший способ.

Использование внешних библиотек исключено, если только они не могут работать отдельно, из-за используемой платформы (нет стандартной библиотеки, даже printf), а ситуация требует, чтобы я ДОЛЖЕН использовать эти расширенные байты ASCII. Действительно, должен быть какой-то способ представить это внутри строки, не так ли? Конечно, я не первый, кто хочет ставить escape-символы непосредственно рядом с заглавными буквами A и B.

2 ответа

Решение

C имеет функцию, которая заставляет соседние строковые литералы объединяться в одну строку.

Например, три отдельных строковых литерала "hello" " " "world" становится единственной строкой "hello world",

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

"\xCD" "Baby  \xCD"

или же

"\xDF" "EDWARD\xDF"

Для получения дополнительной информации о различных фазах перевода см., Например, эту ссылку. Две фазы, которые важны для этого случая, это фаза 5, которая обрабатывает escape-последовательности, и фаза 6, которая выполняет сцепление.

Это можно сделать несколькими способами. Как писал @Olaf: разбить строку

printf("%s", "\xDF" "EDWARD" "\xDF" "\n");
Другие вопросы по тегам