模拟库函数中strstr的算法思想详解

char* strstr(char* str1,char* str2);
  • strstr函数的作用strstr是头文件为<string.h>中检索字符串2是否为字符串1的子串。如果是:返回字符串1中子串的地址。如果不是:返回空指针NULL。

  • 例如:

#include<stdio.h>
#include<string.h>
int main()
{   char arr1[]="abcdef";
    char arr2[]="cde";
    char* ret=strstr(arr1,arr2);
    printf("%s",ret);    
} 
  • 模拟库函数中strtsr的算法以及详解 :用两个指针*x,*y记录字符串1字符串2第一个字符的地址,用*x检索字符串1。如果*x检索到字符串1中的某个字符a字符串2的首个字符相等,即从a开始与字符串2内的每个字符开始匹对(从a开始*x*y匹对)。如果中间有不相等的字符跳出匹对,并且*x重新来到a的下一个字符,*y重新回到字符串2的首字符。*x再次检索,如果又遇到a。再次匹对。直到匹对成功。

  • 代码如下

#include<stdio.h>
char* my_strstr(const char* p1,const char* p2)//用const修饰保持arr1,arr2在检索子串的过程中,字符串的内容不会发生改变。const修饰的变量会具有常量属性。
{  
     char *s1=NULL;
     char *s2=NULL;
     char *start=(char*)p1;
     if(!*p2)//如果arr2传给*p2的是'\0', 直接返回。'\0'也是arr1的子串。
     {
        return (char*)p1;//强制类型转换。    
     } 
      while(*start)//检索子串的核心算法。
   {     s1=start;
         s2=(char*)p2; 
         while(*s1==*s2 && *s2 && *s2)
           {  
              s1++;
              s2++;
           }
         if(!*s2)//是子串。
           {     
             return (char*)start;
           }
           start++;
   }
    return NULL;//不是子串。
}
int main()
{  char arr1[]="abcdef";
   char arr2[]="cde";
   char* ret=my_strstr(arr1,arr2);
   printf("%s",ret);
   return 0;     
} 

新人一枚,如有问题请多多关照。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猴有管

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值