C语言 为什么strlen()函数不能返回十六进制字符串的正确长度?

gijlo24d  于 2022-12-26  发布在  其他
关注(0)|答案(3)|浏览(136)

我有一个十六进制字符串,例如\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()函数是将十六进制作为字符串处理,还是有什么不清楚的地方?

j2cgzkjk

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定义预处理器宏,并在数组定义和其他需要该长度的地方使用该长度。

lyfkaqu1

lyfkaqu12#

这是因为在索引[4]处有**零

string_[0] == 0xF5
string_[1] == 0x17
string_[2] == 0x30
string_[3] == 0x91
string_[4] == 0
...

将具有整数0xf5char放置在位置[0]
要将其视为字符串,需要转义\字符

const char string_[] = "\\xF5\\x17\\x30\\x91\\x00\\xA1\\xC9\\x00\\xDF\\xFF";
kiz8lqtg

kiz8lqtg3#

在编译时,您的“字符串”显示为用C语法表示的连续十六进制值,位于一对引号内。
strlen()是一个运行时函数,它扫描一系列字节,查找零值字节的第一个示例。
理解“编译时”和“运行时”之间的区别是很好的。

相关问题