模拟实现字符串常见函数(4):strstr函数

1.函数功能

我们来看看相关网站对它的解释

翻译一下就是:strstr函数会返回字符串1中字符串2的起始位置,如果没有,就返回0。这是一个类似于找字串的函数。

2.模拟实现

基本思路是这样的:首先定义两个指针分别指向str1和str2的起始位置,同时我们还需要一个额外的指针来记录成功匹配的位置,成功时返回它(strstr函数返回的类型是字符指针)。

两个指针从头开始遍历,如果相等,str2就加1继续匹配下面的字符,如此一来,当碰到str2的/0时就会退出循环,这时候返回str1指向的位置下标即可。

但要是不匹配成功呢,如果一次不匹配成功,这是我们额外的指针就派上用场了。这里设为cp,每当匹配不成功时,cp就加1,从下个位置继续开始匹配(如果每次都从头匹配,可能还没达到相等的位置就已经匹配不成功了),这是str2要归零,所以不能直接用str2来遍历,一旦字符串过长时,就会丢失起始位置。为了方便,用是s1,s2来代替str1和str2来遍历,每次匹配不成功就让s1指向cp的位置开始匹配直到匹配成功,返回cp的位置下标。

代码语言:javascript
复制
char* my_strstr(const char* str1, const char* str2)//返回的是从cp位置开始后面的字符串
{
	char* cp =(char*) str1;
	char* s1;
	char* s2;
	if (!*str2)
		return ((char*)str1);//如果str2为空,直接返回str1
	while (*cp)
	{
		s1 = cp;
		s2 = (char*) str2;
		while (*s1 && *s2 && !(*s1 - *s2))
		{
			s1++;
			s2++;
		}
		if (!*s2)
			return (cp);
		cp++;
}

}

int main()
{
char str1[] = "abbbbcdef";
char str2[] = "bbc";
char* ret = my_strstr(str1, str2);
printf("%s", ret);

return 0;

}