有人能解释一下这段代码中发生了什么吗?
#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;
}
为什么输出?
1
26
答案 0 :(得分:4)
问题在于"\x01""a"
与"\x01a"
,以及hex-&gt; char转换和字符串连接在词法处理的不同阶段发生的事实。
在第一种情况下,在连接之前扫描并转换十六进制字符
字符串,因此第一个字符被视为\x01
。那么&#34; a&#34;是
连接,但是已经执行了hex-> char转换,
连接后没有重新扫描,所以你得到两个字母
\x01
和a
。
在第二种情况下,扫描程序将\x01a
视为单个字符,
使用ASCII码26。
答案 1 :(得分:2)
在C中,以十六进制指定的字符(如"\x01"
)可以有两位以上的数字。在第一种情况下,"\x01""a"
是字符1,后跟'a'。在第二种情况下,"\x01a"
,即字符0x1a,即26。