zoukankan      html  css  js  c++  java
  • 模拟实现strstr和strrstr

      strstr函数用于判断str2是否是str1的子串,如果是,则返回str2在str1中首次出现位置的地址,如果不是则返回NULL.其模拟实现代码如下:
    #include<iostream> 
    using namespace std;
    #include<assert.h>
    char* my_strstr(const char* str1, const char* str2)
    {
        assert(str1&&str2);
        const char* p = str1;
        const char* q = str2;
        const char*start = NULL;
        while (*p)
        {
            start = p;
            while (*p&&*q&&*p == *q)
            {
                p++;
                q++;
            }

            if (*q == '')
            {
                return (char*)start;
            }
            p = start + 1;
            q = str2;
        }
        return NULL;
    }

    测试代码:

    //#include<string>
    char str[] = "lazy";
    char String[] = "The quick brown dog jumps overs the lazy fox.";
    void main()
    {
        char* pdest;
        int result;
        printf("String to be searched: %s ", String);
        pdest = my_strstr(String, str);
        result = pdest-String  + 1;
        if (pdest != NULL)
            printf("%s is found at position %d. ", str, result);
        else
            printf("%s is not found ",str);
    }
    这个start非常关键,它保存了str2在str1中首次出现的位置。

      下面我们再模拟实现一下strrstr,这个函数看起来跟strstr很像,但它又是什么功能呢?strrstr是在字符串中查找指定字符串最后一次出现的位置。其模拟实现如下:

    #include<iostream>
    using namespace std;
    #include<assert.h>
    char* my_strrstr(char* str1,char str2[])
    {
        assert(str1&&str2);
        char* last = NULL;
        char* start = str1;
        int j = 0;
        while (*str2 == 0)
        {
            return 0;
        }
            
        while (*str1&&*str2)
        {
            start = str1;
            while (*str1&&str2[j]&&*str1 == str2[j])
            {
                str1++;
                j++;
            }
            if (str2[j]== '')
            {
                last = start;
            }
            str1 = start + 1;
            j = 0;
        }
        if (*str1 == '')
            return last;
        else
            return NULL;
    }

    测试代码:
    void main()
    {
        char* str1 = "abcdefcdefop";
        char* str2 = "def";
        printf("%s ", my_strrstr(str1,str2));
    }
    注意在实现strrstr的时候这里也有个start,这里的start存的也是匹配成功后的字符串的位置,但是随着程序的执行,如果字符串的后面继续有匹配成功的字符串,那么后面的这个地址将取代start里面原来的地址,当程序结束后,start里面存的就是字符串中查找到的指定字符串最后一次出现的位置。

  • 相关阅读:
    《python编程从入门到实践》变量和简单数据类型
    《初学python》
    centos7 关闭防火墙
    记几个学习资源
    servlet-api.jar
    spring 对Map的一种扩展 MultiValueMap
    CPU飚高问题解决
    聊聊数据库优化
    netty的核心组件
    【转】 一个著名的日志系统是怎么设计出来的?
  • 原文地址:https://www.cnblogs.com/qingjiaowoxiaoxioashou/p/5913887.html
Copyright © 2011-2022 走看看