my_strstr-C-20211231

my_strstr

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
char *my_strstr(const char *str1,const char *str2);
int main(int argc,char *argv[]){
	char *str1="abcdefaaacefb";
	char *str2="aace";
	char *result=my_strstr(str1,str2);
	printf("%s\n",result?result:"未找到");
return 0;}
//
char *my_strstr(const char *str1,const char *str2){
	assert(str1&&str2);//断言两个指针不为NULL
	const char *ret1=str1,*ret2=str2,*cur=str1;//拷贝两个指针防止原指针被改动,cur(存储初始校对位置用于校对失败复位和校对成功返回地址)
	while(*ret1&&*ret2){//ret1或ret2指向\0时跳出循环.(!*ret1&&!*ret2):同步到达末位,校对成功;(!*ret2&&*ret1&&(ret1!=str1)):校对成功;(!*ret2&&*ret1&&(ret1==str1)):比较未开始已结束,*str2为\0;(!*ret1&&*ret2):ret1指向\0时ret2未指向\0,校对失败
		if(*ret1!=*ret2&&*ret2!=*str2) {ret2=str2;ret1=++cur;continue;}//*ret1!=*ret2且*ret2!=*str2,校对失败,ret2复位,ret1进至++cur的位置
		if(*ret1!=*ret2) {ret1=++cur;continue;}//*ret1!=*ret2且*ret2==*str2,比较中,ret1进至++cur的位置
		if(*ret1==*ret2) {ret1++;ret2++;}//开始校对,ret1与ret2同步前进,cur指向校对初始位置不动
	}
return (!*ret2&&(ret1!=str1))?cur:((ret1==str1)?"要查找的\\0在末位":0);}
//1.ret2指向\0且ret1不为初始值,校对成功,返回cue(ret1-strlen(str2))
//2.ret2指向\0且ret1为初始值,比较未开始已结束,ret2初始值为\0,返回特殊回答
//3.ret2不指向\0,即是ret1指向\0,校对失败,返回0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fleet1126

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值