strchr 与 strstr 函数都是 C 语言标准库 string.h 里面的字符串查找函数,核心差别是 strchr 用来查找单个字符,strstr 用来查找子字符串,strchr 接收的查找目标是一个 char 类型字符,返回该字符第一次出现位置的指针,strstr 接收的查找目标是一整段字符串,返回这个子串第一次出现位置的指针,两个函数查找失败的时候都会返回空指针 NULL,这是 C 语言笔试考研非常高频的考点,很多初学者容易混淆二者的查找对象,把单字符查找和子串查找弄混,同时还要理解两个函数都属于只读查找,不会修改原字符串,查找过程都会自动识别字符串末尾的零终止符,不会越界读取后面内存。
核心参数与返回值对照
| 项目 | strchr | strstr |
|---|---|---|
| 头文件 | string.h | string.h |
| 函数原型 | char strchr const char str int c | char strstr const char str1 const char str2 |
| 查找对象 | 单个字符 | 连续子字符串 |
| 查找方向 | 从字符串开头向后查找 | 从主串开头向后查找 |
| 成功返回 | 目标字符首次出现位置指针 | 子串首次出现起始位置指针 |
| 查找失败 | 返回 NULL | 返回 NULL |
| 是否修改原串 | 不修改 | 不修改 |
底层执行原理
strchr 在执行的时候,会从主字符串首地址开始逐个字节遍历,每读取一个字符就和传入的目标字符做比较,一旦匹配成功就立刻停止遍历,返回当前这个位置的指针,如果一直遍历到字符串结束符都没有匹配,就返回 NULL,这里要注意传入的 int c,本质会转换成 unsigned char 进行比较,这是很多教材容易忽略的细节。
strstr 执行逻辑要更复杂,它是在主串里面寻找连续匹配的子串,外层循环移动主串的起始比对位置,内层循环逐字符对比主串片段和待查找子串,当子串全部字符连续匹配成功,就返回主串里面这个匹配片段的起始指针,如果全部遍历完成没有完整匹配,就返回 NULL,如果传入的待查找子串是空字符串,标准规定会直接返回原主串的首地址。
使用实操步骤
第一步 引入头文件 string.h,写代码之前必须包含这个头文件,否则编译器会报隐式声明警告。
第二步 准备待查找的源字符串,确认字符串是以零终止符正常结尾,避免内存越界。
第三步 根据查找目标选择函数,如果只是找某一个单独字符,选用 strchr,如果是找一段连续文字,选用 strstr。
第四步 接收函数返回的指针变量,一定要判断返回值是否等于 NULL,不能直接解引用,防止空指针崩溃。
第五步 如果需要继续查找下一次匹配位置,可以在上一次返回指针的基础上偏移一个字节,再次调用函数,实现多次遍历查找。
第六步 完成测试,验证查找成功和查找失败两种场景,确认返回指针指向的内容符合预期。
strchr 与 strstr 函数核心区分点就是查找单位,strchr 是单字符查找,strstr 是连续子串查找,两个函数都属于只读查询,返回指针或者空指针,写代码必须做空指针判断,笔试的时候经常会出代码阅读题,重点考察返回值含义,以及两个函数适用场景的选择。
【常见问题】
问题 1 strchr 与 strstr 函数查找失败返回什么
回答 1 strchr 与 strstr 函数查找失败的时候,都会返回空指针 NULL,写代码的时候必须判断返回值,不能直接访问指针内容。
问题 2 strchr 与 strstr 函数会不会修改原来的字符串
回答 1 strchr 与 strstr 函数都属于只读查找函数,执行查找过程不会改动源字符串里面任何字符,仅做读取对比操作。
问题 3 strchr 与 strstr 函数查找空子串的时候 strstr 是什么表现
回答 1 strchr 与 strstr 函数里面,strstr 如果待查找子串为空,按照 C 标准会直接返回主串首地址,strchr 不存在空字符之外的这类特殊规则。
问题 4 strchr 与 strstr 函数需要引入哪个头文件
回答 1 strchr 与 strstr 函数都需要引入 string.h 头文件,缺少头文件会触发编译器隐式声明警告,部分环境下运行会异常。
【免责申明】
本内容为 C 语言标准库函数学习讲解,不同编译器对标准实现细节会存在微小差异,代码讲解仅供学习参考,正式项目开发请以 C 标准文档和所用编译器官方说明为准。
