strstr函数的使用和模拟实现

strstr函数的参数

在这里插入图片描述
strstr函数的功能:
strstr函数是在字符串中找到一个子字符串
找到返回str2在str1中第一次出现的位置。
如果str2在str1中没有出现,就返回NULL。

strstr函数的使用

基于上面strstr函数的参数和功能,编写一段代码:

int main()
{
	char arr1[] = "asfeeabcdfgabcdd";
	char arr2[] = "abc";
	char* ret = strstr(arr1, arr2);
	if (ret != NULL)
		printf("%s\n", ret);
	else
		printf("找不到\n");

	return 0;
}

代码结果如下:
在这里插入图片描述
strstr函数返回的是数组arr2在数组arr1中第一次出现的位置。

strstr函数的模拟实现

char* my_strstr(const char* str1,const char* str2)
{
	assert(str1);
	assert(str2);
	const char* cp = str1;//cp记录可能找到匹配的字符串的起始位置
	const char* s1 = NULL;
	const char* s2 = NULL;

	//如果寻找的字符串是空字符串,直接返回str1
	if (*str2 == '\0')
		return str1;

	while (*cp)
	{
		s1 = cp;
		s2 = str2;
		while (*s1 == *s2 && *s1 && *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
			return cp;
		cp++;
	}
	return NULL;
}
int main()
{
	char arr1[] = "wasfsfsdaf";
	char arr2[] = "defq";
	char* ret = my_strstr(arr1, arr2);
	if (ret != NULL)
		printf("%s\n", ret);
	else
		printf("找不到\n");

	return 0;
}

代码讲解:
cp的作用是:记录可能找到匹配的字符串的起始位置
s1的作用是:是遍历数组arr1
s2的作用是:是遍历数组arr2
str1的作用是:接收从主函数传参过来的arr1
str2的作用是:接收从主函数传参过来的arr2
进入主函数,先给数组arr1一串字符用于查找arr2数组中的字符串是否与arr1数组中有相同的字符,然后调用my_strstr函数用于查找,用char *ret接收形参的返回值。
进入形参,用指针str1,str2分别接收主函数传过来的arr1数组和arr2数组。先断言str1和str2为非空指针,以确保指针str1和str2有效性。然后给cp赋值str1,s1,s2赋值NULL。先判断指针str2是否为空字符串,如果是直接返回str1地址,不是则继续往下执行。进入第一个循环,cp≠'\0'执行循环,='\0'跳出循环。在循环中,把cp值赋给s1,str2值赋给s2,若s1=s2,s1、s2 ≠ '\0',进入第二个循环,然后s1和s2往后拿取一个字符继续比较。若s2拿取到 '\0'时,结束第二个循环,然后返回cp地址。若比较到后面字符不相等,第二个循环也会结束,然后cp重新记录可能找到匹配的字符串的起始位置。若cp拿取到'\0'时候没有匹配的字符则返回空指针。

如图:
strstr函数的使用和模拟实现_第1张图片

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