本文汇总了全网各路大佬的经验(其实没几篇),努力打造最强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真不好用......;
祝德井大爷生日快乐( •̀ ω •́ )✧