[英]Why the strlen() function doesn't return the correct length for a hex string?
我有一个十六进制字符串,例如\xF5\x17\x30\x91\x00\xA1\xC9\x00\xDF\xFF
,当尝试使用strlen()
function 获取该十六进制字符串的长度时,它返回 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()
function 是将该十六进制作为字符串处理,还是我不清楚?
对于 C 标准库中的字符串函数,值为零的字符(也称为空字符)标记字符串的结尾。 您的字符串包含\x00
,它指定一个空字符,因此字符串在那里结束。 它前面有四个非空字符,因此strlen
返回四个。
C 2018 7.1.1 1 说:
字符串是由第一个空字符终止并包括第一个空字符的连续字符序列……字符串的长度是空字符之前的字节数……
C 2018 7.24.6.3 2 说:
strlen
函数计算s
[它的第一个参数] 指向的字符串的长度。
您可以将数组的大小计算为sizeof string_
(因为它是char
的数组)或sizeof string_ / sizeof *string_
(计算元素的数量而不考虑类型),但这将包括一个终止空字符,因为定义了一个数组[]
并让长度从字符串文字初始值设定项计算,包括字符串文字的终止空字符。 您可能需要对数组的长度进行硬编码,可能使用#define
来定义预处理器宏,并在数组定义和其他需要该长度的地方使用该长度。
strlen()
迭代到\0
(类似于\x0
)。 然后它只计算"\xF5\x17\x30\x91"
,它是四个字符。
这是因为你在索引[4]
处有零
string_[0] == 0xF5
string_[1] == 0x17
string_[2] == 0x30
string_[3] == 0x91
string_[4] == 0
...
"\xf5"
将具有整数值0xf5
的char
放在位置[0]
要将其视为字符串,您需要转义\
字符
const char string_[] = "\\xF5\\x17\\x30\\x91\\x00\\xA1\\xC9\\x00\\xDF\\xFF";
在编译时,您的“字符串”显示为一对引号内用 C 语法表示的连续十六进制值。
strlen()
是一个运行时函数,它扫描一系列字节,寻找零值字节的第一个实例。
理解“编译时”和“运行时”之间的区别是很好的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.