首页 > 精选问答 >

问 strchr 与 strstr 函数 C 语言字符串查找详解

2026-11-12 20:26:58
最佳答案

答

strchr 与 strstr 函数都是 C 语言标准库 string.h 里面的字符串查找函数,核心差别是 strchr 用来查找单个字符,strstr 用来查找子字符串,strchr 接收的查找目标是一个 char 类型字符,返回该字符第一次出现位置的指针,strstr 接收的查找目标是一整段字符串,返回这个子串第一次出现位置的指针,两个函数查找失败的时候都会返回空指针 NULL,这是 C 语言笔试考研非常高频的考点,很多初学者容易混淆二者的查找对象,把单字符查找和子串查找弄混,同时还要理解两个函数都属于只读查找,不会修改原字符串,查找过程都会自动识别字符串末尾的零终止符,不会越界读取后面内存。

核心参数与返回值对照

项目strchrstrstr
头文件string.hstring.h
函数原型char strchr const char str int cchar 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 标准文档和所用编译器官方说明为准。