C 字符串中 ASCII 转义旁边的普通字符

Normal characters next to ASCII escapes in C strings

我正在为特定的非标准平台编写 C 程序,我需要打印出包含扩展 ASCII 代码的字符串以绘制基于文本的 UI。但是,我一直需要打印出如下所示的字符串:

"\xCDBaby  \xCD"

"\xDFEDWARD\xDF"

目标是打印出单词 "Baby" 和 "EDWARD",在它们的每一端都有扩展的 ASCII 字节。不幸的是,C 编译器将这些解释为多字节字符转义,因为它将 "Baby" 中的 B 和 a 以及 "EDWARD" 中的 E 和 D 视为指定多字节字符值的十六进制数字,而不是单个字节字符转义后跟普通文本。有没有办法将转义与真实字符分开,例如标记十六进制数结尾的无值转义?现在我的解决方法是插入一个“%c”并使用平台的 printf 格式将正确的值放在那里,但它很老套,必须有更好的方法。

使用外部库是不可能的,除非它们可以 运行 独立,由于我使用的平台(没有标准库,甚至没有 printf),而且情况要求我必须使用这些扩展的 ASCII 字节。真的,应该有某种方法可以在字符串中表示它不应该存在吗?当然,我不是第一个想要将转义符直接放在大写字母 A 和 B 旁边的人。

可以通过多种方式完成。正如@Olaf 所写:拆分字符串

printf("%s", "\xDF" "EDWARD" "\xDF" "\n");

C 有一个功能,可以将相邻的字符串文字连接成一个字符串。

例如,三个单独的字符串文字 "hello" " " "world" 变成单个字符串 "hello world"

这在像您这样的情况下很有用,因为处理字符串文字中的转义序列是在 连接之前完成的。所以你可以通过使用多个字符串文字来解决你的问题,比如

"\xCD" "Baby  \xCD"

"\xDF" "EDWARD\xDF"

有关不同翻译阶段的更多信息,请参见例如this reference. The two phases that are important for this case are phase 5 which handles escape sequences, and phase 6 进行串联。