(strstr的实现)

1.介绍

const char * strstr ( const char * str1, const char * str2 );

查找子字符串 返回指向 str1 中第一次出现的 str2 的指针,如果 str2 不是 str1 的一部分,则返回空指针。

匹配过程不包括终止空字符,但它止步于此。

2.我自己写的(自己尝试的,暂时没发现bug如果有可以跟我说)

我们可以根据上面的需求写出strstr的函数 下面开始


char* my_strstr(const char* p1, const char* p2)
{
	assert(p1 && p2);
	const char* tmp = p2;
	if (*p2 == '\0')
		return p1;
	
	while (*tmp&&*p1)//都为真才往下循环
	{
		if(*p1 == *tmp)//当两个字符相等时才同时相加
        p1++, tmp++;
		else if (*(p1 - 1) == *tmp)//有可能是我的首字母正好和他的首字母相同,但是因为p1++我指向了首字母后面一位
			--p1;				   //所以用这个判断是否因为一个字符的大小错过,如果差一个字符下面的--p1正好前移一位
		else if (*p1 != *tmp)//当两个字符不相等时,需要把tmp重新返回到初始(首字母)位置,
			p1++, tmp = p2;
	}
	if (!*tmp)//当*tmp为'\0'时为假,但是加上!则为真,于是返回指针
		return p1 - strlen(p2);//减去一个p2的长度是因为要使指针指到找到字符串的位置
	else if (!*p1)//当*p1为'\0'时,因为前面判断了tmp所以如果*p1为'\0'时就是没有找到包含的字符串,返回空指针
		return NULL;
}
int main()
{
	const char* arr1 = "abcaabcdef";
	const char* arr2 = "abcdef";
	const char*p=my_strstr(arr1, arr2);
	if ( p== NULL)
		printf("没找到\n");
	else
		printf("找到了%s\n",p);
	return 0;
}

3.这个是库函数(推荐)

//自己实现strstr
char* my_strstr(const char* p1, const char* p2)
{
	assert(p1 && p2);
	if (*p2 == '\0')
		return(char*) p1;
	const char* m = NULL;//设两个空指针m.n
	const char* n = NULL;
	const char* ret = p1;//将p1赋值给ret
	while (*ret++)//每次循环ret++直到ret为'\0'时退出循环输出
	{
		m = p1,n = p2;//把p1赋值给m,p2赋值给n,当下方判断为假时n重新变回首字母地址
		while (m && n && !( * m - *n))//如果相减为0,感叹号则为真继续执行
		{
			m++,n++;
			if (*n == '\0')
				return (char*)p1;//因为前面的p1是进行了const所以要加上char*强制转换
			if (*m == '\0')//当p1字符串数量低于p2时,但是m和n相等时,在*m=='\0'时返回空指针
				return NULL;
		}
	}
	return NULL;//因为*ret=='\0'所以里面没有符合条件的字符串所以直接返回NULL
}
int main()
{
	const char* arr1 = "abc";
	const char* arr2 = "abcdef";
	const char* p = my_strstr(arr1, arr2);
	if (p == NULL)
		printf("没找到了\n");
	else
		printf("找到了%s\n", p);
	return 0;
}