C语言strstr函数的模拟实现

博客主要介绍了C语言中strstr函数的自我实现。该函数用于在一个字符串里查找另一个字符串是否存在,并返回其首元素位置。详细说明了实现步骤,包括传入字符串地址、比较元素、使用临时指针变量等,还提到可将代码块封装成函数简化。

strstr函数的自我实现,功能是在arr1字符串里找是否存在arr2字符串,并返回找到的arr2字符串首元素的位置

#include<stdio.h>
//strstr函数的自我实现
char* my_strstr(const char* arr1,const char* arr2)
{
    while(*arr1)
    {
        if(*arr1 == *arr2)
        {
            char* temp1 = arr1;
            char* temp2 = arr2;
            while(*temp1 == *temp2)
            {
                temp1++;
                temp2++;
                if(*temp2 =='\0')
                    return arr1;
            }
        }
        arr1++;
    }
    return NULL;
}
int main()
{
    char arr1[] = "abcdefabcdef";
    char arr2[] = "efa";
    char arr3[] = "fab";
    char arr4[] = "abs";
    
    char* find_arr2 = my_strstr(arr1,arr2);
    if(find_arr2)
    {
        int result2 = (int)(find_arr2 - arr1) +1;
        printf("找到%s子串了,在%d位置处\n",arr2,result2);
    }
    else
        printf("没找到%s子串\n",arr2);
    
    
    char* find_arr3 = my_strstr(arr1,arr3);
    if(find_arr3)
    {
        int result3 = find_arr3 - arr1 +1;
        printf("找到%s子串了,在%d位置处\n",arr3,result3);
    }
    else
        printf("没找到%s子串\n",arr3);
    
    char* find_arr4 = my_strstr(arr1,arr4);
    if(find_arr4)
    {
        int result4 = find_arr4 - arr1 +1;
        printf("找到%s子串了,在%d位置处\n",arr4,result4);
    }
    else
        printf("没找到%s子串\n",arr4);
    return 0;
}

(解析)
1.关于函数的实现,先传入两个字符串(首元素)地址,比较arr1里面每个元素是不是等于arr2第一个元素,如果不等于接着往下找(arr1地址加1),等于的话判断:
2.将arr1,arr2此时的地址分别传给临时指针变量temp1,temp2,相等的话两个地址同时加1,然后再进行比较,如果temp2的地址指向了’\0’,则意思是arr2这个字符串里的元素和arr1某个子串完全一样,此时可以返回arr1地址(注意,不是temp1地址,因为temp1负责移动比较,此时temp1地址已经移动)
3.如果想算在第几个地址处,可以拿返回的地址减去arr1起始元素地址,得到差值加一

因为这样的代码块出现了很多次,所以我们可以把它放到一个函数里简化

if(find_arr2)
    {
        int result2 = (int)(find_arr2 - arr1) +1;
        printf("找到%s子串了,在%d位置处\n",arr2,result2);
    }
    else
        printf("没找到%s子串\n",arr2);
    

即简化为

#include<stdio.h>
//strstr函数的自我实现
char* my_strstr(const char* arr1,const char* arr2)
{
    while(*arr1)
    {
        if(*arr1 == *arr2)
        {
            char* temp1 = arr1;
            char* temp2 = arr2;
            while(*temp1 == *temp2)
            {
                temp1++;
                temp2++;
                if(*temp2 =='\0')
                    return arr1;
            }
        }
        arr1++;
    }
    return NULL;
}
void decide(char* arr1,char* arr2,char* arr3)
{
    if(arr3)
    {
        int result = (int)(arr3 - arr1) +1;
        printf("找到%s子串了,在%d位置处\n",arr2,result);
    }
    else
        printf("没找到%s子串\n",arr2);
}
int main()
{
    char arr1[] = "abcdefabcdef";
    char arr2[] = "efa";
    char arr3[] = "fab";
    char arr4[] = "abs";
    
    char* find_arr2 = my_strstr(arr1,arr2);
    decide(arr1,arr2,find_arr2);
    
    char* find_arr3 = my_strstr(arr1,arr3);
    decide(arr1,arr3,find_arr3);
    
    char* find_arr4 = my_strstr(arr1,arr4);
    decide(arr1,arr4,find_arr4);
    
    return 0;
}

这样就简单一点了

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值