进阶C语言------>字符函数和字符串函数------strstr函数

strstr函数:在一段长字符串中找出对应的短字符串("abcdef"中找出"bcd",即找字符串子集

//strstr函数
int main()
{
	char arr1[100] = "abcdefdedede";
	char arr2[] = "de";
	char* ret = strstr(arr1, arr2);//将找到的子字符串的地址传给ret
	
	if (NULL == ret)
	{
		printf("找不到");
	}
	else
	{
		printf("%s\n", ret);
	}
	return 0;
}

进阶C语言------>字符函数和字符串函数------strstr函数_第1张图片

 例子直观明了,找到de后会将d的地址传回char* ret,打印由于地址的连续存放的,所以会将de后面的字符也打印出来


进阶C语言------>字符函数和字符串函数------strstr函数_第2张图片

 代码解释如图


由于strstr返回地址,从而可以实现链式访问

进阶C语言------>字符函数和字符串函数------strstr函数_第3张图片

 


char* my_strstr(const char* str1, const char* str2)//const提高代码健壮性
{
	assert(str1 && str2);//断言
 
	const char* s1 = str1;//操作一份新的拷贝字符防止str1乱动从而无法回到初始位置
	const char* s2 = str2;

    const char* cur = str1;//目标标记
 
	while (*cur)
	{
		s1 = cur;//s1要看cur的脸色,与cur++的位置匹配
		s2 = str2;//每次第二个while因为字符不匹配而跳出循环回到第一个while,则str2指向要重新回到最初位置

		while (*s1 && *s2 && (*s1 == *s2))//当第一次出现匹配字符,并且s1,s2不为NULL
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')//当第二个while遍历匹配完成,如果s2=='\0',则说明匹配成功,找到了子字符串
		{
			return ((char*)cur);//类型有所差异,强制类型转换
		}
		cur++;//第二关while循环每次匹配失败跳出循环时,cur会++,从而从++的位置重新匹配
	}
	return NULL;//找不到返回空指针
}

int main()
{
	char arr1[20] = "abbbcdefwfw";
	char arr2[] = "bbc";
	char* ret = my_strstr(arr1, arr2);

	if (NULL == ret)
	{
		printf("找不到子串\n");
	}
	else
	{
		printf("%s\n", ret);
	}
	return 0;
}

代码解释参考注释

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