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

时间: 2024-10-17 19:35:32

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

模拟实现strstr

模拟实现strstr: 在系统库函数中,存在strstr函数,它用于查找子字符串.它的函数原型为: char *strstr( const char *string, const char *strCharSet ); 这个函数中是要从*string中查找*strCharSet子字符串.因为只是查找,这两个字符串都不用发生改变,所以将他们声明为常量字符串. 模拟实现strstr: #include<stdio.h> #include<stdlib.h> char *my_strst

c语言 模拟 库函数 strstr()函数

//模拟 库函数  strstr()函数 //从父字符串(较长)找到 完全相同子字符串(较短): //返回相同字符串在父字符串中的首字符的地址: #include<stdio.h> char * my_strstr(char arr[],char arr1[]) { char *p1=NULL,*p2=NULL,*p=NULL; int i = 0,j = 0,k=0,m=0; p1 =&arr[0]; p2 = &arr1[0]; while (1) { if (arr1[0

模拟实现strstr函数。

//1.模拟实现strstr函数. #include<stdio.h> #include<assert.h> char *my_strstr(char *str, char*p) {  char *cp = p;  char *p1 = str;  assert(*p);  if (!*p)   return NULL;  if (!*p1)   return NULL;  char *p2 = str;  while (*p1)  {   p2 = p1;   cp = p;  

【c语言】模拟库函数strstr

// 模拟库函数strstr #include <stdio.h> #include <assert.h> const char* my_strstr(const char *parent, const char *child) { const char *pgo = parent; const char *cgo = child; const char *pgos = parent; assert(parent != NULL && child != NULL);

模拟实现strstr函数

写一个函数,模拟strstr()函数,strstr()函数主要将主串中子串,以及以后的字符全部返回. 比如:在abbcdeef中查找bcde,返回bcdeef 思想: 1.遍历整个长串,然后找到与短串相同的位置,并且记录这个位置 2.与短串依次比较,若在后面某个位置不相同了,这时候,将刚记录的长串的位置后移一位继续比较:若一直都相同,则返回刚才记录的位置 3.如果长串遍历都没找到,则返回NULL #include<stdio.h> #include<stdlib.h> #inclu

【C语言】【面试题】【笔试题】模拟实现strstr函数

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<assert.h> #include<stdlib.h> char *my_strstr(const char *dst,const  char *src) {     assert(dst);     assert(src);     char *p = dst;     char *s1 = p;     char *s2 = src;     

部分函数功能的实现

1:strcpy的实现 函数功能:把从src地址处开始的字符串拷贝到以dest为开始地址的空间里, 其中包含src字符串结尾处的'\0'. 代码实现: #include<stdio.h>//模拟实现strcpy#include<assert.h>void my_strcpy(char *dest,  const char *src)/*函数不需要返回*/{    assert(dest); assert(src); while(*src)/*把src的字符从前到后往dest里拷贝*

str与wcs相关函数

strstr      strchr    strrstr     strtchr     strlen    strcpy     strcmp     strncmp      sprintf_s      sscanf_s     单字节 wcsstr    wcschr  wcsrstr   wcsrchr   wcslen  wcscpy   wcscmp   wcsncmp   swprintf_s     swscanf_s   宽字节 _tcsstr    _tcschr  _t

C语言中模拟实现strcpy,strstr,strcat函数

在C中,要模拟实现这几个库函数,是对指针的传参与函数的调用的考察,代码如下,仅供参考 strcpy函数: #include <assert.h> char* my_strcpy(char* dest, const char* src) { assert(dest);//断言指针的有效性 assert(src); char*pa = dest; while (*dest++ = *src++) ; return pa; } strstr函数: int my_strstr(const char*s