自学C语言-视频-张鹏伟-20211231

自学C语言-视频-张鹏伟-20211231,第1张

自学C语言-视频-张鹏伟-20211231

my_strstr

#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
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("%sn",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指向时跳出循环.(!*ret1&&!*ret2):同步到达末位,校对成功;(!*ret2&&*ret1&&(ret1!=str1)):校对成功;(!*ret2&&*ret1&&(ret1==str1)):比较未开始已结束,*str2为;(!*ret1&&*ret2):ret1指向时ret2未指向,校对失败
		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指向且ret1不为初始值,校对成功,返回cue(ret1-strlen(str2))
//2.ret2指向且ret1为初始值,比较未开始已结束,ret2初始值为,返回特殊回答
//3.ret2不指向,即是ret1指向,校对失败,返回0

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5692677.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存