You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何strlen()函数无法正确返回十六进制字符串的长度?

为什么strlen()返回4?

strlen()的核心逻辑

strlen()的工作方式非常直接:它从传入的字符指针开始,逐个字节扫描内存,只要遇到空字符\0(十六进制表示为\x00)就立即停止计数,返回的结果是扫描过的非空字符的数量,不包含这个结束符本身。它完全不关心字节的具体内容是打印字符还是十六进制非打印字符,只认\0作为字符串的终止标志。

你的案例分析

看你给出的十六进制字节序列:\xF5\x17\x30\x91\x00\xA1\xC9\x00\xDF\xFF,第5个字节就是\x00(空字符)。当strlen()扫描到这个位置时,直接停止,所以前面的4个非空字节(\xF5、\x17、\x30、\x91)就是它返回的长度4。

你可能混淆的点

你提到的“十六进制字符串”本质是包含非打印字符和空字符的字节序列,但strlen()并不把它当成“十六进制编码的字符串”处理——它没有解析十六进制的逻辑,只是按字节找\0。如果你的需求是计算整个字节序列的长度(比如这里的10个字节),不能用strlen():

  • 如果你是直接初始化数组为原始字节:const char string_[] = {0xF5, 0x17, 0x30, 0x91, 0x00, 0xA1, 0xC9, 0x00, 0xDF, 0xFF};,可以用sizeof(string_) / sizeof(string_[0])来获取总长度10。
  • 你当前的代码const char string_[] = { "\xF5\x17\x30\x91\x00\xA1\xC9\x00\xDF\xFF" };其实是把字符串字面量存入数组,而字符串字面量会自动在末尾追加一个\0,所以数组的实际长度会比你输入的序列多1,但strlen()依然会在第一个内部的\0处停止。

内容的提问来源于stack exchange,提问作者Lion King

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 07:50:18