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