C语言字符串函数系列之模拟实现strstr 详细讲解

本文详细介绍了C语言中如何自定义strstr函数,用于在一个字符串中查找另一个字符串,包括创建变量和函数、处理字符比较和优化过程,以及解决可能出现的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

前言:

思路:

代码实现:

1 创建变量和函数

 2 找到str1中与str2首元素相同的字符

 3 对比str1和str2的字符,直到str2指向'\0'

完整代码展示:


前言:

strstr()是一个库函数,头文件为string.h。

其作用是在一个字符串中找另一个字符串,找到了返回第一次出现的首元素地址。没找到就返回空指针。

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

strstr()有两个参数,参数1是目标字符串,参数2是源字符串。找到了就返回第一次出现的首元素地址,没找到就返回空指针。

思路:

指针str1指向第一个字符串的首元素,指针str2指向第二个字符串的首元素。当str1 != str2时,只有str1向后移动,而str2保持不动。

当str1和str2所指向的内容相同时,那么str1和str2都要向后移动,知道str2指向‘\0'。

 因此

1 创建变量和函数

2 找到str1中与str2首元素相同的字符

3 对比str1和str2的字符,直到str2指向'\0'

但是,操作过程中会发现新的问题,例如:

 出现这样的问题,我们应该如何调整我们的思路呢?

这个时候,str2必须要回到'c'的位置,重新与str1进行比较,那么,我们可以增加一个变量,暂时存放"cde"的首元素地址。

代码实现:

1 创建变量和函数

char* my_strstr(const char* str1, const char* str2)

int main()
{
	char arr1[10] = { "abccdefg" };
	char arr2[10] = { "cde" };
	my_strstr(arr1, arr2);
	return 0;
}

 2 找到str1中与str2首元素相同的字符

 3 对比str1和str2的字符,直到str2指向'\0'

char* my_strstr(const char* str1, const char* str2)
{
    //判断一下str1和str2是否为空指针
	assert(str1 && str2);
	//只要*str1还没找到\0,就还可以循环
	while (*str1)
	{
		//如果字符相等,两个字符都往后面挪
		while (*str1 && *str2 && *str1 == *str2)
		{
			str1++;
			str2++;
			//直到第二个字符找到\0
			if (*str2 == '\0')
			{
				return *str1;
			}
		}
		//*str2不等于*str1就只挪*str1
		str1++;
	}
	return NULL;

}

写到这里还没完,这么写就会出现,刚才分析的问题。那要如何解决呢?

增加两个变量,一个存放str1,一个存放str2指向的首元素地址。str1++不会影响p1,str2++也不会影响p2,那么在比较中出现不同的时候,就可以将p2的值赋给str2,再重新比较。

char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 && str2);
	//为什么要单独放一个p1 p2呢?
    //防止出现str1[]="abccdefg" 而str2[]="cde"这种情况
	char* p1 = str1;
	char* p2 = str2;
	//只要p1还没找到\0,就还可以循环
	while (*p1)
	{
		str1 = p1;
		str2 = p2;
		//如果字符相等,两个字符都往后面挪
		while (*str1 && *str2 && *str1 == *str2)
		{
			str1++;
			str2++;
			//直到第二个字符找到\0
			if (*str2 == '\0')
			{
				return *str1;
			}
		}
		//*str2不等于*str1就只挪*str1
		p1++;
	}
	return NULL;

}

完整代码展示:

char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 && str2);
	//为什么要单独放一个p1 p2呢?防止出现str1[]="abccdefg" 而str2[]="cde"这种情况
	char* p1 = str1;
	char* p2 = str2;
	//只要p1还没找到\0,就还可以循环
	while (*p1)
	{
		str1 = p1;
		str2 = p2;
		//如果字符相等,两个字符都往后面挪
		while (*str1 && *str2 && *str1 == *str2)
		{
			str1++;
			str2++;
			//直到第二个字符找到\0
			if (*str2 == '\0')
			{
				return *str1;
			}
		}
		//*str2不等于*str1就只挪*str1
		p1++;
	}
	return NULL;

}
int main()
{
	char arr1[10] = { "abccdefg" };
	char arr2[10] = { "cde" };
	my_strstr(arr1, arr2);
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值