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 == '\0')
        {
            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\n", String);
    pdest = my_strstr(String, str);
    result = pdest-String  + 1;
    if (pdest != NULL)
        printf("%s is found at position %d. \n", str, result);
    else
        printf("%s is not found\n",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]== '\0')
        {
            last = start;
        }
        str1 = start + 1;
        j = 0;
    }
    if (*str1 == '\0')
        return last;
    else
        return NULL;
}

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

最新文章

  1. Android网络编程1
  2. OC与JS的交互
  3. 2015/11/9用Python写游戏,pygame入门(8):按钮和游戏结束
  4. Java_Java SE6调用动态编译
  5. broadcom代码中httpd进程启动流程介绍
  6. Mesos源码分析
  7. golang作为server向android提供数据服务
  8. 南阳理工ACM 括号匹配问题,并求出使得括号能够匹配需要新增的最小括号数(括号匹配(二))
  9. Drawable和Bitmap的区别
  10. classpath多个包添加
  11. Java基础知识强化之IO流笔记31:转换流出现的原因和格式
  12. (转载)PHP array_slice() 函数
  13. android 网络交互
  14. 我理解的malloc()和free()。
  15. python查询完结篇
  16. 吴裕雄 python深度学习与实践(17)
  17. 论文阅读笔记五:U-Net: Convolutional Networks for Biomedical Image Segmentation(CVPR2015)
  18. debug protractor
  19. vs.code调试node.js的C++扩展
  20. 10个JavaScript难点

热门文章

  1. 201671010140. 2016-2017-2 《Java程序设计》java学习第十六周
  2. launcher启动应用重启的BUG解决
  3. Python_09-面向对象编程
  4. nodemon 的坑
  5. DBArtist之Oracle入门第2步: 了解Oracle的Database Control
  6. ubuntu eclipse opencv环境配置
  7. 回文链表 &#183; Palindrome Linked List
  8. 653. Two Sum IV - Input is a BST 二叉树版本
  9. CloudStack tomcat集成方式分析
  10. Ajax定时局部刷新