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