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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)