字符串的查找

  1. C实现strstr  
  2. 1111111111111111111111111111
  3. #include <iostream>  
  4. #include <string>  
  5. using namespace std;  
  6. //c语言实现strstr  
  7.   
  8. const char* isSub(const char* str, const char *subs){  
  9.     //特殊情况  
  10.     if(!*subs)  
  11.         return str;  
  12.   
  13.     const char* tmp=str;  
  14.     while (*tmp!='\0')  
  15.     {  
  16.         //用于每次将父串向后移动一个字符  
  17.         const char* tmp1=tmp;  
  18.         //记录子串地址  
  19.         const char* sub1=subs;  
  20.   
  21.         while (*sub1!='\0'&&*tmp1!='\0')  
  22.         {  
  23.             //若不相等则跳出,将父串后移一个字符  
  24.             if (*sub1!=*tmp1)  
  25.                 break;  
  26.             //若相等且子串下一个字符是末尾则是这个父串的子串  
  27.             if (*sub1==*tmp1&&*(sub1+1)=='\0')  
  28.                 return tmp;  
  29.             //若相等则继续比较下一个字符  
  30.             if (*sub1==*tmp1)  
  31.             {  
  32.                 sub1++;  
  33.                 tmp1++;  
  34.             }  
  35.         }  
  36.         tmp++;  
  37.     }  
  38.     return NULL;  
  39. }  
  40.   
  41. int main(){  
  42.     char* str1="ababcdddb";  
  43.     char* str="";  
  44.     const char *res=isSub(str1,str);  
  45.     if (res!=NULL)  
  46.     {  
  47.         cout << res << endl;  
  48.     }  
  49.     else  
  50.         cout << "null" << endl;  
  51.     //cout << isSub(str1,str) << endl;  
  52.   
  53.     return 0;  


2222222222222222222222222222222222222222
  1. #include <stdio.h>  
  2.   
  3. const char *my_strstr(const char *str, const char *sub_str)  
  4. {  
  5.     for(int i = 0; str[i] != '\0'; i++)  
  6.     {  
  7.         int tem = i; //tem保留主串中的起始判断下标位置   
  8.         int j = 0;  
  9.         while(str[i++] == sub_str[j++])  
  10.         {  
  11.             if(sub_str[j] == '\0')  
  12.             {  
  13.                 return &str[tem];  
  14.             }  
  15.         }  
  16.         i = tem;  
  17.     }  
  18.   
  19.     return NULL;  
  20. }  
  21.   
  22. int main()  
  23. {  
  24.     char *s = "1233345hello";  
  25.     char *sub = "345";  
  26.     printf("%s\n", my_strstr(s, sub));  
  27.     return 0;  
  28. }  

3333333333333333333333333333333333333333333333333

这个程序的风格、算法、技巧都中规中矩,简洁、明了,感觉就是典型的 C 程序。

/* Written by Philippe De Muyter <phdm@macqel.be>.  */
char *  strstr (buf, sub)
     register char *buf;
     register char *sub;
{
    register char *bp;
    register char *sp;

    if (!*sub)
      return buf;
    while (*buf)
    {
        bp = buf;
        sp = sub;
        do {
            if (!*sp)
              return buf;
        } while (*bp++ == *sp++);
        buf += 1;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值