当前位置: 首页 > news >正文

查找位置函数

特性strstrmemmem
处理对象以 \0 结尾的字符串任意二进制数据(字符串、字节数组等)
搜索终止条件遇到 \0 停止(即使未找完)严格按 haystacklen 限制搜索范围
支持含 \0 的数据不支持(\0 被视为字符串结束)支持(\0 被当作普通字节处理)
参数要求无需指定长度(依赖 \0 识别)必须指定 haystack 和 needle 的长度
返回值类型char*(字符串指针)void*(通用内存指针)

适用场景

  • 用 strstr
    处理标准 C 字符串(以 \0 结尾,不含嵌入 \0),如普通文本、日志字符串等。
    例如:在文本中查找关键词、解析 URL 中的路径等。

  • 用 memmem
    处理二进制数据或含 \0 的特殊字符串,如:

    • 网络协议报文(可能含 \0 作为分隔符)
    • 二进制文件(如图片、音频中的特定字节序列)
    • 含 \0 的自定义格式数据(如固定长度的结构体)

总结

  • strstr 是 “字符串专属查找工具”,依赖 \0 识别字符串边界,适合纯文本处理。
  • memmem 是 “通用内存查找工具”,不依赖 \0,通过显式长度参数控制搜索范围,适合二进制数据或特殊字符串。

在解析协议(如之前提到的 GNSS 报文)时,memmem 更常用,因为协议数据可能包含 \0 或二进制内容,无法用 strstr 正确处理。

        while (index < g_gnss_msg_len_process) {// 1. 查找协议头char *pos = memmem(g_gnss_msg_buf_process + index,       // 起始地址g_gnss_msg_len_process - index,       // 剩余长度PROTOCOL_PACK_STRING[i].head,         // 要找的协议头strlen(PROTOCOL_PACK_STRING[i].head)  // 头长度);/*知识点一: memmem 是一个 内存搜索函数,用于在一段内存区域中查找指定的字节序列。它的功能类似于字符串查找函数 strstr,但 memmem 可以处理二进制数据(包含 \0 的数据),而 strstr 遇到 \0 会停止搜索。函数原型:void *memmem(const void *haystack, size_t haystacklen,const void *needle, size_t needlelen);haystack:要搜索的内存区域(如 GNSS 接收缓冲区)。haystacklen:要搜索的内存长度。needle:要查找的目标数据(如协议头 "$")。needlelen:目标数据的长度。返回值:如果找到,返回目标数据在内存中的地址。如果没找到,返回 NULL。*/if (pos == NULL) break; // 未找到协议头,退出当前协议解析// 2. 移动索引到协议头位置index = pos - g_gnss_msg_buf_process;

http://www.dtcms.com/a/312284.html

相关文章:

  • 垃圾收集器G1ZGC详解
  • 2025年渗透测试面试题总结-2025年HW(护网面试) 77-1(题目+回答)
  • 2025年渗透测试面试题总结-2025年HW(护网面试) 76-1(题目+回答)
  • set和map使用
  • 技巧|SwanLab记录混淆矩阵攻略
  • express-jwt报错:Error: algorithms should be set
  • 【智能体cooragent】不同的单智能体调用的大模型的推理的输入与输出
  • 笔试——Day26
  • 【LLM】如何在Cursor中调用Dify工作流
  • Makefile 从入门到精通:自动化构建的艺术
  • 【Java基础知识 16】 数组详解
  • 微积分思想的严密性转变 | 极限、逼近与程序化
  • 计算机技术与软件专业技术资格(水平)考试简介
  • 【Pytorch✨】LSTM01 入门
  • 集成电路学习:什么是HAL硬件抽象层
  • 【设计模式】 3.设计模式基本原则
  • 对于考研数学的理解
  • 【攻防实战】记一次DOUBLETROUBLE攻防实战
  • build文件夹下面的主要配置文件
  • win10任务栏出问题了,原来是wincompressbar导致的
  • 扫雷游戏完整代码
  • RK3399 启动流程 --从复位到系统加载
  • Munge 安全认证和授权服务的工作原理,以及与 Slurm 的配合
  • 【python】转移本地安装的python包
  • vue3 新手学习入门
  • 【LeetCode 热题 100】(三)滑动窗口
  • 在线任意长度大整数计算器
  • 轻量级鼠标右键增强工具 MousePlus
  • 数据链路层、NAT、代理服务、内网穿透
  • 变频器实习DAY20 测试经验总结