c语言函数实现strstr,C语言实现strstr函数模拟

本文汇总了全网各路大佬的经验(其实没几篇),努力打造最强strstr模拟技术贴(大误)

不说废话直接看实现思路:

定义两个指针*p1,*p2指向两个字符串,开始比较;

若*p1==*p2,则p1++,p2++,两个指针同时向后移动,比较之后的字符;

若*p1!= *p2,则*p2指回str2的头,而对于*p1,要指向开始匹配到的字符的下一个字符,这样才不会漏掉str1中的字符,这就要定义一个指针(pt)用来记录开始匹配到的第一个字符的地址;

循环过程中,如果*p2='\0',则成功找到,这时返回pt就可以了;

如果*p1='\0',这种情况下说明p1剩的比p2还少,不可能找到,于是就想到当  strlen(pt)=strlen(p1)]  ,  返回NULL,这样可以避免多余的不必要的比较;

code demo(IDE:VS2017)

#include

#include

char * my_strstr(const char *str1, const char *str2)

{

char *p1 = (char *)str1;

char *p2 = (char *)str2;

char *pt = (char *)str1;

while (strlen(pt) >= strlen(p2))

{

p1 = pt;

while ((*p1 == *p2)&&(*p2 != '\0'))

{

p1++;

p2++;

}

if (*p2 == '\0')

return pt;

p2 = str2;

pt++;

}

return NULL;

}

int main()

{

char a[100];

char b[100];

char *p = NULL;

gets(a);

gets(b);

p = my_strstr(a, b);

puts(p);

getchar();

return 0;

}

PS:这个方法用到了库,而strstr恰巧就包含在这个库里,Emmm,蛇咬住了自己的尾巴?那就再自己写个strlen函数吧哈哈哈;

网上好多人的做法都是以while(*p1)作为循环条件,这样虽然可以不用strlen函数,但多了不必要的循环次数;

这个的editor真不好用......;

祝德井大爷生日快乐( •̀ ω •́ )✧