C语言自己实现strstr函数功能

本人没参考任何strstr函数的标准源码,自己摸索了一天不断调试,不断修改按自己的逻辑才写出这个字符串查找函数的算法,查找字符串不像一般的字符串复制和连接,情况更复杂,每一种情况都要能查出来,差点就放弃了

strstr函数的功能是字符串查找:
代码:

#include<stdio.h>
#include<string.h>
char* my_strstr(const char* str1, const char* str2)
{
	char* s1 = NULL; 
	char* s2 = (char*)str2; //把str2的首地址保存下来
	while (*str1 && *str2) //其中任何一个字符串找到最后遇到'\0',或者传进来的是空字符串就结束寻找
	{
		while (*str1 && *str2 && (*str1 - *str2)) //str1的每个字符都和str2的首字符比较一轮
			str1++;  //如果两个字符不相同,就让str1自加,直到出现相同的字符为止
		  s1 = (char*)str1;//出现了相同的字符后,就记录下这个字符的地址
		while (*str1 && *str2 && !(*str1 - *str2)) //如果相同就继续往后找,遇到'\0'就停止,或者还没遇到'\0'但是两者不相同也停止
		{
			str1++; //相同就接着往后找
			str2++; //相同就接着往后找
		}
		if (*str2 && *str1) //任何一个字符串找到最后就不要重新比较了,最大的while循环也会退出来
		{
			str1 = s1 + 1; //防止一个字符出现多次,所以让s1往前加一,再和str2重新作比较
			str2 = s2;  //此时str2也要重新指向首字符
		}
	}
	if (!*str2)  
		return (char*)s1;
	return NULL;
}

int main()
{
	char* str1="aabbbbbbbaaabbca";
	char* str2="bbc";
	char *p1=NULL;
	char *p2=NULL;
	p1=my_strstr(str1,str2);
	p2=strstr(str1,str2);
	printf("%s\n",p1);
	printf("%s\n",p2);
	system("pause");
	return 0;
}
	
	

最难处理的是这两种情况:
char str1=“abbbcdef”
char
str2="bcd"

\**************************************************************************\
char
str1=“abbbcaefbcdf”
char
str2= “bcd”**

都是从 str1 里找 str2

要处理上面两种情况,无非就是从str1的首字符和str2的首字符比较一下,如果两个字符不相同,就让str1往后偏移一个字符,继续和str2比较,直到出现相同的字符,用s1记录下这个字符的地址。此时出现了相同的字符,那么就让两个指针都往后偏移一个字符接着比较,不断循环,直到不相同为止。此时又分两种情况,第一种是str2还没遇到 ‘\0’,那么就必须重新让str2指向首字符,让str1指向s1+1这字符,然后又接着和str2比较,过程一样,因为你不知道你后面还有没有你要找的那个字符串,所以还得接着找。第二种情况是str2刚好指向了 ‘\0’,那么这个时候就没必要在找下去了,直接退出大循环。

以上是大致的一个过程,关键还是找字符的思路要清晰,不然就算你语言学的再好,没有算法和思路一样不知道怎么去动手写代码,如果发现结果和自己想的不一样,一定要不断调试找原因,然后不断改进循环的条件,充分考虑所有的情况。算法可以不是最好的,但是功能一定要实现到位

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值