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里面存的就是字符串中查找到的指定字符串最后一次出现的位置。

模拟实现strstr和strrstr的更多相关文章

  1. 【c语言】模拟库函数strstr

    // 模拟库函数strstr #include <stdio.h> #include <assert.h> const char* my_strstr(const char * ...

  2. C语言相关的基础字符串函数

    C语言中没有专门的字符串类型,所以就用字符数组和字符指针形式表示 1 char arr[]="abcdef"; //字符数组表示的字符串 2 char*arr="abce ...

  3. strstr strchr strrchr strrstr

    通过函数的定义来区分: 1.strstr: 返回子串出现的第一次位置 char *strstr(const char *haystack, const char *needle) 可见,strstr函 ...

  4. Organize Your Train part II-POJ3007模拟

    Organize Your Train part II Time Limit: 1000MS Memory Limit: 65536K Description RJ Freight, a Japane ...

  5. C++用PostMessage模拟按钮点击

    有时我们可能会在某个程序中用到模拟按钮点击事件. 本文中的例子在MFC程序中调试通过,duilib的没试过,还需探索 不多说,上代码: #include "stdafx.h" #i ...

  6. ZOJ 2971 Give Me the Number;ZOJ 2311 Inglish-Number Translator (字符处理,防空行,strstr)

    ZOJ 2971 Give Me the Number 题目 ZOJ 2311 Inglish-Number Translator 题目 //两者题目差不多,细节有点点不一样,因为不是一起做的,所以处 ...

  7. strstr()函数实现

    /* 函数要求:写一个函数模拟strstr()函数,设计中不得使用其他库函数. 函数原型:const char *strstr(const char *str1,const char *str2); ...

  8. C++模拟键盘消息

    实现功能:在现有DLL程序中向特定的EXE窗口中发送模拟键盘的消息 使用API根据窗口标题递归查找特定的窗口句柄,之后模拟调用. 注意:keybd_event函数不能在VS下使用,所以用SendInp ...

  9. C语言中的strstr函数

    转自:http://www.cnblogs.com/xy-kidult/archive/2012/12/25/2832460.html 早上翻<C和指针>,碰见一个子串查找问题,这个问题在 ...

随机推荐

  1. [转]字符集、字符编码、XML中的中文编码

    字符集.字符编码.XML中的中文编码 作为程序员的你是不是对于ASCII .UNICODE.GB2321.UTF-7.UTF-8等等不时出现在你面前的这些有着奇怪意义的词感到很讨厌呢,是不是总觉得好象 ...

  2. 使用RampTexture来控制diffuse shading

    [RampTexture] RampTexture(渐变纹理),可以是1D/2D纹理. This allows you to accentuate the surface's colors to fa ...

  3. Gym101128F:Landscaping

    题意 有一片h*w的草坪,要把每一行从左到右修剪一遍,每一列从上到下修剪一遍.每个草坪要么是高低要么是平地.割草机从高地到平地或者从平地到高地,需要花费a.也可以把平地变为高地或者把高地变为平地,花费 ...

  4. @property 修饰符

    原子性--- nonatomic 特质 在默认情况下,由编译器合成的方法会通过锁定机制确保其原子性(atomicity).如果属性具备 nonatomic 特质,则不使用同步锁.请注意,尽管没有名为“ ...

  5. 深入理解mysql的隔离级别

    建表插入测试数据A> create table test(id int ,num int) ;Query OK, 0 rows affected (0.53 sec) A> insert ...

  6. 浅谈利用PLSQL的多线程处理机制,加快处理大数据表的效率

    我们在处理大数据表的时候经常会感觉的处理速度不够快,效率不够高,那么今天下面我就来简单实现下PLSQL的多线程编程处理数据: 我模拟一个简单的场景,把某一张表中的数据(当然这张表的数据非常大)同步到目 ...

  7. windows下 apache,php,mysql,phpadmin集成化安装

    1.appserv 直接下载安装, 2.linux环境下下载安装LAMP

  8. [SoapUI] SoapUI可以做到些什么?功能有多强大?

    SoapUI. The Swiss-Army Knife of Testing. Whether you’re a tester, developer, business analyst, or ma ...

  9. 常用工具类——StringUtils

    /* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreem ...

  10. position与offset的区别

    .offset()是相对于文档(document)的当前位置,.position()是相对于父级元素的位移,一个元素可以嵌套多个position