C字符串字面量中\x十六进制转义解析异常,如何保留后续字符B?
问题解决方法
核心原因
C语言中,\x 开头的十六进制转义序列是贪婪匹配的:它会持续读取后续所有属于十六进制范畴的字符(0-9、a-f、A-F),直到碰到非十六进制字符才停止。所以你写的 \x01B 里,B 是合法的十六进制字符(对应十进制11),编译器会把 \x01B 整体解析为十六进制值 0x1B(ESC控制字符),而非 0x01 加字符 B。
可行的解决方式
拆分字符串字面量:利用C语言中相邻字符串自动拼接的特性,把转义序列和后续字符拆成两个独立的字符串:
char *a = "A\x01" "B";这样
\x01后面没有后续的十六进制字符,B会被当作单独的字符处理,最终字符串就是A+0x01+B。改用八进制转义序列:八进制转义以
\开头,最多读取3个八进制数字(0-7),而B不属于八进制字符,所以会自动终止转义:char *a = "A\001B";这里
\001是八进制表示的1,对应十六进制0x01,后面的B会被解析为单独字符。手动初始化字符数组:直接指定每个字符的ASCII值,完全避免转义序列的歧义:
char a[] = {'A', 0x01, 'B', '\0'};这种方式最直观,每个字符的含义清晰,不会有解析歧义。
内容的提问来源于stack exchange,提问作者exebook
相关产品推荐
相关产品推荐

