我有一个十六进制字符串,例如\xF5\x17\x30\x91\x00\xA1\xC9\x00\xDF\xFF
,当试图使用strlen()
函数获取十六进制字符串的长度时,它返回4!
const char string_[] = { "\xF5\x17\x30\x91\x00\xA1\xC9\x00\xDF\xFF" };
unsigned int string_length = strlen(string_);
printf("%d", string_length); // the result: 4
strlen()
函数是将十六进制作为字符串处理,还是有什么不清楚的地方?
3条答案
按热度按时间j2cgzkjk1#
对于C标准库中的字符串函数,值为零的字符(也称为空字符)标记字符串的结束。您的字符串包含
\x00
,它指定空字符,因此字符串在此结束。它之前有四个非空字符,因此strlen
返回四个。C 2018 7.1.1 1规定:
C 20187.24.6.32期说:
strlen
函数计算s
[它的第一个参数]指向的字符串的长度。您可以将数组的大小计算为
sizeof string_
(因为它是char
的数组)或sizeof string_ / sizeof *string_
(计算元素的数量而不考虑类型),但这将包括终止空字符,因为用[]
定义数组并让长度从字符串文字初始化器计算包括字符串文字的终止空字符。您可能需要硬编码数组的长度,可能使用#define
定义预处理器宏,并在数组定义和其他需要该长度的地方使用该长度。lyfkaqu12#
这是因为在索引
[4]
处有**零将具有整数值
0xf5
的char
放置在位置[0]
要将其视为字符串,需要转义
\
字符kiz8lqtg3#
在编译时,您的“字符串”显示为用C语法表示的连续十六进制值,位于一对引号内。
strlen()
是一个运行时函数,它扫描一系列字节,查找零值字节的第一个示例。理解“编译时”和“运行时”之间的区别是很好的。