如何正确添加hex转义string文字?

当你在C中有string时,你可以在里面添加直接的hex代码。

char str[] = "abcde"; // 'a', 'b', 'c', 'd', 'e', 0x00 char str2[] = "abc\x12\x34"; // 'a', 'b', 'c', 0x12, 0x34, 0x00 

这两个例子在内存中都有6个字节。 现在,如果要在hexinput后添加值[a-fA-F0-9] ,则存在问题。

 //I want: 'a', 'b', 'c', 0x12, 'e', 0x00 //Error, hex is too big because last e is treated as part of hex thus becoming 0x12e char problem[] = "abc\x12e"; 

可能的解决scheme是在定义后进行replace

 //This will work, bad idea char solution[6] = "abcde"; solution[3] = 0x12; 

这可以工作,但它会失败,如果你把它作为const

 //This will not work const char solution[6] = "abcde"; solution[3] = 0x12; //Compilation error! 

如何在\x12后正确插入e而不会触发错误?


为什么我问? 如果要将UTF-8string构build为常量,则必须使用大于ASCII表的字符的hex值。

使用3个八进制数字:

 char problem[] = "abc\022e"; 

或分割你的string:

 char problem[] = "abc\x12" "e"; 

为什么这些工作:

  • 与hex转义不同,标准将三位数字定义为八进制转义的最大值。

    6.4.4.4字符常量

     octal-escape-sequence: \ octal-digit \ octal-digit octal-digit \ octal-digit octal-digit octal-digit 

     hexadecimal-escape-sequence: \x hexadecimal-digit hexadecimal-escape-sequence hexadecimal-digit 
  • string文字连接被定义为比文字转义字符转换更晚的翻译阶段。

    5.1.1.2翻译阶段

    1. 将字符常量和string文字中的每个源字符集成员和转义序列转换为执行字符集的相应成员; 如果没有对应的成员,则将其转换为除null(宽)字符以外的实现定义的成员。 8)

    2. 相邻的string文字标记是连接的。

由于string文字在编译过程的早期阶段是串联的,但转义字符转换之后,您可以使用:

 char problem[] = "abc\x12" "e"; 

虽然你可能更喜欢完全分离的可读性:

 char problem[] = "abc" "\x12" "e"; 

对于我们当中的语言律师来说,这在C11 5.1.1.2 Translation phases (我强调)中包含:

  1. 将字符常量和string文字中的每个源字符集成员和转义序列转换为执行字符集的相应成员; 如果没有相应的成员,则将其转换为除空(宽)字符以外的实现定义的成员。

  2. 相邻的string文字标记是连接的。

为什么我问? 当你想要将UTF-8stringbuild立为常量时,你必须使用hex值的字符大于ASCII表可以容纳的字符。

那么,不。 你不需要。 从C11开始,你可以在string常量前加u8 ,它告诉编译器字符字面量是UTF-8。

 char solution[] = u8"no need to use hex-codes á駵"; 

(顺便一提,C ++ 11也支持相同的东西)