自己实现C语言的strstr功能

首先我们明白strstr的功能是在主字符串str1中查找副字符串str2,如果找到就返回一个char*的地址。
例如在"abcdef"中查找"cde",输出时输出"cdef"
当找不到时会返回一个NULL的指针
那个下面就是代码的实现
我们首先想到的应该是这样的

  const char *Mystrstr(const char *str1, const char *str2)
{
	while (*str1 != '\0')
	{
		const char *p = str1;
		while (*str1 != '\0' && *str2 != '\0'&&*str1 == *str2)
		{
			str1++;
			str2++;
		}
		if (*str1 == '\0')
		{
			return NULL;
		}
		if (*str2 == '\0')
		{
			return p;
		}
		str1++;
	}
	return NULL;
int main()
	{
		char dest[50] = "abbcdef";
		char *src = "bbc";//这里的字符串存在字符常量区,比写成数组安全性要高
		//要保证的是dest要能放的下src
		printf("dest:%s  src:%s\n", dest, src);
		printf("dest:%s\n", Mystrstr(dest, src));
		system("pause");
		return 0;
	}
//然而在实现的过程中,我们发现如果将主字符串改成"abbbcdef"它就会出现错误,如图

在这里插入图片描述
因为这样写代码错误之处在于返回值的问题和在检查主字符串的时候没有进行往返的检查,只检查了一次,所以改进后的代码是这样的

const char *Mystrstr(const char *str1, const char *str2)
{
	const char *s1 = NULL;
	const char *s2 = NULL;
	const char *start = str1;
	while (*start != '\0')
	{
		**s1 = start;//s1回退到上一次的下一个位置
		s2 = str2;//s2回退到str2的起始位置**
		while (*s1 != '\0' && *s2 != '\0'&&*s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s1 == '\0')
		{
			return NULL;
		}
		if (*s2 == '\0')
		{
			return start;
		}
		start++;
	}
	return NULL;
}
int main()
{
	char dest[50] = "abbbcdef";
	char *src = "bbc";//这里的字符串存在字符常量区,比写成数组安全性要高
	//要保证的是dest要能放的下src
	printf("dest:%s  src:%s\n", dest, src);
	printf("dest:%s\n",Mystrstr(dest, src));
	system("pause");
	return 0;
}

重点是用黑体标出来的那两行代码,这样我们就可以找出来想要的字符串了。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值