C字符串和十六进制字符

C字符串和十六进制字符,c,c-strings,C,C Strings,有人能解释一下这段代码中发生了什么吗 #include <stdio.h> void f(const char * str) { printf("%d\n", str[4]); } int main() { f("\x03""www""\x01""a""\x02""pl"); f("\x03www\x01a\x02pl"); return 0; } 在C语言中,用十六进制指定的字符(如“\x

有人能解释一下这段代码中发生了什么吗

    #include <stdio.h>

    void f(const char * str) {
      printf("%d\n", str[4]);
    }

    int main() {
      f("\x03""www""\x01""a""\x02""pl");
      f("\x03www\x01a\x02pl");
      return 0;
    }

在C语言中,用十六进制指定的字符(如
“\x01”
)可以有两个以上的数字。在第一种情况下,
“\x01”a“
是字符1,后跟“a”。在第二种情况下,
“\x01a”
,即字符0x1a,即26。

问题在于
“\x01”a“
“\x01a”
,以及十六进制->字符转换和字符串连接发生在词法处理的不同阶段

在第一种情况下,十六进制字符在连接之前进行扫描和转换 字符串,因此第一个字符被视为
\x01
。那么“a”就是 已连接,但已执行十六进制->字符转换, 连接后不会重新扫描,所以会得到两个字母
\x01
a

在第二种情况下,扫描仪将
\x01a
视为单个字符,
使用ASCII码26。

因为在这些字符串的第五位,字符的ASCII值为
1
26
。使用
printf(“%s”,str)
打印字符串。谢谢。有没有办法用字符串文字编写0x01来防止此错误?当然,可以使用
“\x01”“a”
“\x01\x61”
    1
    26