strstr这个库函数看到这个名字大概率猜不到这是什么函数,
但经过学习就可以很好的认识到这个函数
目录
- 介绍:
- 模拟实现:
- 思路:
- 代码实现:
介绍:
可以看到此函数是用来寻找一个字符串中是否含有另一个字符串
代码示例:
int main()
{
char str1[] = "abbbbcd";
char str2[] = "bbc";
char* ret = strstr(str1, str2);
printf("%s\n", ret);
return 0;
}
结果:
模拟实现:
思路:
-
整体思路:
- 1.当相对应的位相等时,让指向两个字符串的指针++,进行遍历
- 2.如若不等时,让子串指针回到起点,主串指针回到开始遍历的下一位,进行新一轮的比较 详细思路:
- 1.首先我们会接受两个字符串的指针参数,但我们尽量的不用原始的指针进行操作,这既是保护了他们的安全,也会更方便的找到起始位置
-
2.故我们先创建
s1
与s2
分别作为子串与主串用来遍历的指针,再创建一个ret
的指针用来返回参数 -
3.开始比较之前有一个先决条件,即
ret
所指向的字符串不为空,因为ret
是用来返回找到字符串后的开始遍历地址,若是空字符串就没必要判断。 -
4.现在开始比较,利用
while
循环,相同则两指针++
,直到两方不相等,此时跳出循环,我们需要判断跳出的s2
指针是否是0
,
如果是,就代表找到了,
如果不是,需要ret++
,因为当前的ret已经不可能是子串在主串的起始位置。 -
5.进行新一轮的判断,注意新一轮开始后
重置s1与s2
指针
代码实现:
char* my_strstr(const char* str1, const char* str2)
{
char* s1 = str1;
char* ret = str1;
char* s2 = str2;
assert(str1 && str2);
while (*ret)
{
s1 = ret;
s2 = str2;
while (s1 && s2 && *s1 == *s2)//防止解引用到空指针
{
s1++;
s2++;
}
if (*s2 == 0)
return ret;
ret++;
}
}
int main()
{
char str1[] = "abbbcdef";
char str2[] = "bbc";
printf("%s\n", my_strstr(str1, str2));
return 0;
}
欢迎纠错与讨论