一、函数介绍
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
,直到找到匹配的子串或确定没有匹配为止。