C 字符串和十六进制字符
C string and hex characters
谁能解释这段代码中发生了什么?
#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
在 C 中,以十六进制指定的字符(如 "\x01"
)可以有两位以上的数字。在第一种情况下,"\x01""a"
是字符 1,后面是 'a'。第二种情况,"\x01a"
,就是字符0x1a,也就是26.
问题在于 "\x01""a"
与 "\x01a"
,以及十六进制 -> 字符转换和字符串连接发生在词法处理的不同阶段这一事实。
在第一种情况下,十六进制字符在连接之前被扫描和转换
字符串,因此第一个字符被视为 \x01
。然后 "a" 是
串联,但 hex->char 转换已经执行,
连接后不会重新扫描,所以你会得到两个字母
\x01
和 a
.
在第二种情况下,扫描仪将 \x01a
视为单个字符,
使用 ASCII 码 26.
谁能解释这段代码中发生了什么?
#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
在 C 中,以十六进制指定的字符(如 "\x01"
)可以有两位以上的数字。在第一种情况下,"\x01""a"
是字符 1,后面是 'a'。第二种情况,"\x01a"
,就是字符0x1a,也就是26.
问题在于 "\x01""a"
与 "\x01a"
,以及十六进制 -> 字符转换和字符串连接发生在词法处理的不同阶段这一事实。
在第一种情况下,十六进制字符在连接之前被扫描和转换
字符串,因此第一个字符被视为 \x01
。然后 "a" 是
串联,但 hex->char 转换已经执行,
连接后不会重新扫描,所以你会得到两个字母
\x01
和 a
.
在第二种情况下,扫描仪将 \x01a
视为单个字符,
使用 ASCII 码 26.