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;
}
 
欢迎纠错与讨论


















