模拟实现strstr函数

目录

前言

一、了解strstr函数

二、模拟实现

1.代码解释

2.拓展延申

总结


前言

了解strstr函数,模拟实现strstr函数


一、了解strstr函数

原型:extern char *strstr(char *haystack, char *needle);

用法:#include <string.h>

功能:从字符串haystack中寻找needle第一次出现的位置(不比较结束符NULL)。

说明:返回指向第一次出现needle位置的指针,如果没找到则返回NULL。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include <string.h>
int main()
{
    char arr1[10] = "abcdefg";
    char arr2[] = "bcde";
    char* ret = strstr(arr1, arr2);
    if (ret == NULL) {
        printf("没找到!\n");
    }
    else {
        printf("找到了!\n");
    }
    return 0;
}

二、模拟实现

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include <string.h>
#include<assert.h>
//模拟实现strstr函数
char* my_strstr(const char* str1,const char* str2) {
    assert(str1 && str2);
    const char* s1 = NULL;
    const char* s2 = NULL;
    const char* cp = str1;
    //如果查询的字符串为空返回str1
    if (*str2 == '\0') {
        return (char*)str1;
    }
    while (*cp) {
        s1 = cp;//字符串位置回退
        s2 = str2;
        //防止越界访问
        while (*s1 && *s2 && (*s1 == *s2)) {
            s1++;
            s2++;
        }
        if (*s2 == '\0') {
            return (char*)cp;
        }
        cp++;
    }
    return NULL;
}
int main()
{
    char arr1[10] = "abbbcdefg";
    char arr2[5] = "bbc";
    char* ret = my_strstr(arr1, arr2);
    if (ret == NULL) {
        printf("没找到!\n");
    }
    else {
        printf("找到了!\n%s",ret);
    }
    return 0;
}

1.代码解释

我们想要查找第二个字符串是否在第一个字符串里首先就要找到第一个字符串中与第二个字符串首元素相同的地址之后在向后比较str2最后遇到'\0'停止,但是要注意虽然可以在第一个字符串找到与第二个字符串首元素相同的地址,但后面不一定与第二个字符串相同.

例:我们要在字符串"abbbcdefg"查找"bbc",首先我们从第一个字符串找到与第二个字符串首元素相同的地址,就找到了"bbbcdefg",接下来我们就进行一个一个往后比较,但是当比较到c字符时我们发现并不相同,如果在进行这样的比较则会越过一定的字符串从而发生错误,所以我们要进行位置回退,回退到"bbcdefg"在进行比较.

2.拓展延申

在以上代码思路我们是通过一个字符一个字符进行比较,我同时也想出运用strncmp()函数进行比较这样我们就不会涉及到用第三个指针进行回退的问题,strncmp比较时只需比较strlen(str2)个字符即可.但可能出现越界访问的问题.


总结

模拟实现strstr函数,主要是要考虑到指针回退,知道这一点思路就清晰了.

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笔写落去

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值