From:
man strchr
char *strchr(const char *s, int c);
strchr() 函数返回一个指向字符 c 在字符串 s 中第一次出现的位置的指针。
这里“字符”的意思是“字节”;这些函数不适用于宽字符或多字节字符。
不过,如果我尝试搜索多字节字符,例如é
(0xC3A9
以 UTF-8 编码):
const char str[] = "This string contains é which is a multi-byte character";
char * pos = strchr(str, (int)'é');
printf("%s\n", pos);
printf("0x%X 0x%X\n", pos[-1], pos[0]);
我得到以下输出:
� 这是一个多字节字符
0xFFFFFFC3 0xFFFFFFA9
尽管有警告:
警告:多字符字符常量 [-Wmultichar]
这是我的问题:
- 这是什么意思
strchr
不适用于多字节字符? (它seems工作,提供int
类型足够大以包含最多 4 个字节的多字节)
- 如何摆脱警告,即如何安全地恢复多字节值并将其存储在 int 中?
- 为什么要加前缀
0xFFFFFF
?
strchr()
似乎只适用于您的多字节字符。
内存中实际的字符串是
... c、o、n、t、a、i、n、s、' '、0xC3、0xA9、' '、w ...
你打电话时strchr()
,你实际上只是在寻找0xA9
,这是低 8 位。这就是为什么pos[-1]
具有多字节字符的第一个字节:在搜索过程中它被忽略。
A char
在您的系统上签名,这就是为什么您的字符被符号扩展(0xFFFFFF
)当你打印出来时。
至于警告,编译器似乎试图告诉您您正在做一些奇怪的事情,而您确实是这样做的。不要忽视它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)