【C语言】模拟实现strstr

strstr这个库函数看到这个名字大概率猜不到这是什么函数,
但经过学习就可以很好的认识到这个函数

目录

  • 介绍:
  • 模拟实现:
    • 思路:
    • 代码实现:

介绍:

【C语言】模拟实现strstr_第1张图片

可以看到此函数是用来寻找一个字符串中是否含有另一个字符串

代码示例:

int main()
{
	char str1[] = "abbbbcd";
	char str2[] = "bbc";
	char* ret = strstr(str1, str2);
	printf("%s\n", ret);

	return 0;
}

结果:
【C语言】模拟实现strstr_第2张图片

模拟实现:

思路:

整体思路:
1.当相对应的位相等时,让指向两个字符串的指针++,进行遍历
2.如若不等时,让子串指针回到起点,主串指针回到开始遍历的下一位,进行新一轮的比较
详细思路:
1.首先我们会接受两个字符串的指针参数,但我们尽量的不用原始的指针进行操作,这既是保护了他们的安全,也会更方便的找到起始位置
2.故我们先创建 s1s2分别作为子串与主串用来遍历的指针,再创建一个 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;
}

欢迎纠错与讨论

你可能感兴趣的:(c语言,开发语言)