【C语言】strstr查找字符串函数

一、函数介绍

strstr 是 C 语言标准库 <string.h> 中的字符串查找函数 ,用于在主字符串中查找子字符串 的首次出现位置。若找到子串,返回其首次出现的地址;否则返回 NULL。它是处理字符串匹配问题的核心工具之一。

二、函数原型

cs 复制代码
char *strstr(const char *haystack, const char *needle);
  • 参数说明:

    • haystack:主字符串(被查找的字符串)。

    • needle:子字符串(要查找的目标)。

  • 返回值:

    • 找到时:返回子串首次出现的指针地址。

    • 未找到时:返回 NULL。

  • 特点 :区分大小写,如 "Hello" 中查找 "hello" 会失败。

三、基础用法示例

1. 查找成功场景

cs 复制代码
#include <stdio.h>
#include <string.h>

int main() 
{
    char str[] = "Welcome to MY CSDN blog!";
    char sub[] = "CSDN";
    
    char *result = strstr(str, sub);
    if (result != NULL)
 {
        printf("找到子串!位置:%ld\n", result - str);  // 输出:找到子串!位置:14
        printf("匹配内容:%s\n", result);              // 输出:CSDN blog!
} 
else 
{
        printf("未找到子串。\n");
}
    return 0;
}

2. 查找失败场景

cs 复制代码
char *result = strstr("Apple", "app");  // 返回NULL(大小写敏感)
四.模拟实现
cs 复制代码
const char* my_strstr(const char* str1, const char* str2)
{
	const char* s1 = NULL;
	const char* s2 = NULL;
	const char* cur = str1;

	assert(str1 && str2);

	if (*str2 == '\0')//特殊场景
		return str1;

	while (*cur)
	{
		s1 = cur;
		s2 = str2;
		while (*s1 && *s2  && *s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
			return cur;

		cur++;
	}

	return NULL;
}

int main()
{
	char arr1[] = "abbbcdef";
	char arr2[] = "bbc";
	const char* ret = my_strstr(arr1, arr2);
	if (ret == NULL)
		printf("找不到\n");
	else
		printf("%s\n", ret);

	return 0;
}
分析:

这里需要创造三个指针,cur用来储存运算的地址。

1. 进行外层while循环(*cur)判断条件逐个往后排序知道遇到\0,在外层循环中,s1 被初始化为当前的 cur 位置,即 str1 中的当前位置;s2 被初始化为 str2 的起始位置。再进行内层while循环,while的判断条件是
1 *s1 和 *s2 都不为 \0(即两个字符串都没有到达末尾)
2. *s1 == *s2(即当前字符相同)。

3. 如果上述条件都满足,则 s1 和 s2 都向后移动一个字符位置(s1++ 和 s2++),继续比较下一个字符。(这一行代码确保了在两个字符串都不为空且当前字符相等的情况下,继续比较下一个字符,从而实现字符串的逐字符匹配。)

匹配结果:

当内层的 while 循环结束时,检查 *s2 是否为 \0。如果是,则说明 str2 已经完全匹配了 str1 中的一个子串,此时返回 cur,即匹配开始的位置。

如果不是,则继续外层循环,从 str1 的下一个字符开始重新尝试匹配。(cur++)

如果外层循环结束且没有找到匹配的子串,则返回 NULL。

总结:

外层循环遍历 str1 的每一个可能的起始位置,内层循环则负责从该位置开始逐字符比较 str1 和 str2,直到找到匹配的子串或确定没有匹配为止。

相关推荐
CoderYanger18 分钟前
Java EE 进阶:4.Spring Web MVC 入门(第一弹)
java·开发语言·前端·spring·面试·java-ee·mvc
估值探索者32 分钟前
【Python量化选股流水线 #04】选股器好不好用?「昨日候选→今日表现」回看验收
开发语言·python·股票数据·股票数据api接口
爱喝热水的呀哈喽2 小时前
HEJIAN RESEARCH
开发语言·matlab
白露与泡影2 小时前
后端 Java 面试核心八股汇总|高频面试题 + 解析,覆盖基础到进阶
java·开发语言·面试
xifangge20252 小时前
基于 JavaScript 实现 CNC 数控切削参数与螺纹公差纯前端核算引擎
开发语言·前端·javascript
“AI国潮设计-小江”2 小时前
【AIGC实战】Python+SDXL批量生成「潮汕英歌舞冰淇淋蛋糕&红桃粿咖啡」IP,固定角色形象批量出甜品商业效果图
开发语言·人工智能·python·prompt·aigc
鱼很腾apoc2 小时前
【MySQL】第4期 用户管理与 C 语言连接编程详解
linux·服务器·c语言·mysql·connector/c
\光辉岁月/2 小时前
3.包装类
java·开发语言·包装类
FRing033 小时前
JavaScript入门到精通二十四(正则表达式、元字符、修饰符)
开发语言·前端·javascript·正则表达式
西索斯coding3 小时前
Grok 4.7 调用一直 401 怎么办?不是 Key 过期,是 Authorization 头格式问题——排查全流程 + 修复示例
服务器·开发语言·ai·php