C语言:模拟实现strstr函数与strchr函数

strstr函数:

要模拟实现strstr函数,首先我们应该了解一下strstr函数的定义与功能:strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。

那么下面我们来具体说明一下怎么模拟实现strstr函数:首先我们要知道它具体是怎么判断一个字符串是否为另一个字符串的子串,我们的基本思想是:

  1. 定义两个指针,分别指向子串的第一个字符和母串的第一个字符。然后依次进行比较,如果指针指向位置的字符子串和母串相等,并且子串和母串都没有到结束标识符,那么我们将子串和母串的指针分别+1,指向下一个字符,再进行比较。
  2. 如果不相等,需要跳出循环,并且让母串的指针+1,指向下一个字符的位置,而子串要指向起始位置,再进行比较。
  3. 这里我们可以定义两个指针变量来存放子串和母串,让这两个临时指针变化,而子串和母串的指针位置保存下来,这样我们不相等时就可以找到原来子串和母串的位置了。
  4. 如果保存子串的临时指针变量找到了结束标识符,就说明找到了子串,那么返回母串。如果循环完了都没有找到子串的结束标志符,那么就说明没找到,返回空指针。
  5. 同时还要考虑到如果子串为空,那么直接返回母串。
  6. 要注意使用assert断言子串和母串不为空指针,并且我们是要要判断一个字符串是否为另一个字符串的子串,不需要改变字符串所以要用const修饰指针变量,以起到保护作用。

下面是具体实现代码:

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

char* my_strstr(const char*str1, const char*str2)
{
    assert(str1 != NULL);
    assert(str2 != NULL);
    if (*str2 == '\0')//如果子串为空,那么直接返回母串
    {
        return str1;
    }
    while (*str1 != '\0')//如果母串指针没有指到'\0',即没有到结束标识符,进行循环
    {
        /*定义两个临时指针变量存放分别存放str1和str2的地址,因为str1和str2的位置要记录下来
           临时变量变化不会改变str1和str2的变化*/
        const char* s1 = str1;
        const char* s2 = str2;
        /*当s1、s2没有指向'\0'并且s1、s2所指位置的字符相等时,让s1和s2分别++,即向后面的字符移动*/
        while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)
        {
            s1++;
            s2++;
        }
        if (*s2 == '\0')//如果s2的指针指向了'\0',即指向了字符串结束标志,那么就说明找到了子串,这时返回母串
        {
            return str1;
        }
        str1++;//s1、s2没有指向'\0'并且s1、s2所指位置的字符相等时不成立时,将str1向后移动,再次循环比较
    }
    return NULL;//如果循环完了还没有找到子串,那么返回NULL
}
int main()
{ 
    char *str1 = "abbbbcdefghijk";
    char *str2 = "bbc";
    char *ret = NULL;
    ret = my_strstr(str1, str2);
    if (ret != NULL)
    {
        printf("找到了:%s\n", ret);
    }
    else
    {
        printf("没找到\n");
    }
    system("pause");
    return 0;
}

下面是运行结果:

这里写图片描述

strchr函数:
同样的,首先我们先来看看strstr这个函数的功能和用法:它的功能是查找字符串s中首次出现字符c的位置。 它的原型是:

char *strchr(const char* _Str,char _Val)

也就是在字符串_Str中查找是否有字符_Val,如果有,返回字符_Val首次出现的位置,如果没有,返回NULL。

那么现在我们来看看具体怎么实现strchr这个函数:
我们的基本思想是当字符串指针没有指向’\0’时,如果字符串指针指向的位置和要查找的字符相等时,那么返回字符串指针的所指向的当前位置,如果不相等,让字符串指针加1,向后移动,再与要查找的字符比较,依次循环,直到找到要查找的字符。如果循环结束,即字符串指针已经走到了’\0’的位置,还没有找到要查找的字符,那就说明没有找到,返回NULL。

下面是具体实现代码:

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

char* my_strchr(const char*str, char c)
{
    assert(str != NULL);
    while (*str != '\0')//当字符串没有走到结束标识符时,进行循环
    {
        /*当字符串的指针指向位置的字符和要查找的字符c相等时,返回此时的字符串,否则将字符串指针++,
        再循环进行下一次比较,直到找到字符c。如果循环完了也没有找到那么返回空指针*/

        if (*str == c)
        {
            return str;
        }


        str++;
    }
    return NULL;
}
int main()
{
    char* str = "abcdefgh";
    char c = 'b';
    char* ret = NULL;
    ret = my_strchr(str, c);
    if (ret != NULL)
    {
        printf("找到了:%s\n", ret);
    }
    else
    {
        printf("没找到\n");
    }
    system("pause");
    return 0;
}

运行结果如下图
这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值