首先,字符串查找函数是在目的字符串中查找源字符串的首次出现的具体位置,若找到了便返回该位置的地址,若没有找到,则返回空指针NULL

char* strstr(const char*arr1 , const char* arr2);

#include<stdio.h>
#include<assert.h>
char* my_strstr(const char* arr1,const char* arr2)//查找字符串,目的地字符串和源头字符串的内容不发生改变(const)
{
    assert(arr1 != NULL);
    assert(arr2 != NULL);//确保指针的有效性
    char* s1 = arr1;
    char* s2 = arr2;
    char* cur = arr1;//将arr1的地址赋给cur,用cur来控制查找的起始位置
    if (*arr2 =='\0')//说明arr2字符串是空串,则返回arr1的地址
    {
        return arr1;
    }
    while (*cur)//循环继续的条件是*cur!=NULL
    {
        s1 = cur;//将cur赋给S1
        s2 = arr2;
        while ((*s1 != '\0') && (*s2 != '\0') && (*s1 == *s2))//满足这三个条件,则继续查找下一个字符,判断是否相同
        {
            s1++;
            s2++;
        }
        if (*s2 == '\0')//字符串2已经查找结束,说明找到了
        {
            return cur;
        }
        cur++;//如果上面的情况均不是,则cur++找目的字符串的下一个字符进行下一次对比
    }
    return NULL;//说明*cur为0,即找不到,返回空指针
}
int main()
{
    char arr1[10] = "abcdefg";
    char arr2[] = "cd";
    char* p=my_strstr(arr1,arr2);
    printf("%s",p );
    return 0;
    }

那么此代码能不能继续优化呢?当然可以

如果*S1='\0',而*S2!='\0',说明目的字符串已经查找完了,而要找的字符串还没有找完,说明找不到,因而这样改代码

#include<stdio.h>
#include<assert.h>
char* my_strstr(const char* arr1,const char* arr2)//查找字符串,目的地字符串和源头字符串的内容不发生改变(const)
{
    assert(arr1 != NULL);
    assert(arr2 != NULL);//确保指针的有效性
    char* s1 = arr1;
    char* s2 = arr2;
    char* cur = arr1;//将arr1的地址赋给cur,用cur来控制查找的起始位置
    if (*arr2 =='\0')//说明arr2字符串是空串,则返回arr1的地址
    {
        return arr1;
    }
    while (*cur)//循环继续的条件是*cur!=NULL
    {
        s1 = cur;//将cur赋给S1
        s2 = arr2;
        while ((*s1 != '\0') && (*s2 != '\0') && (*s1 == *s2))//满足这三个条件,则继续查找下一个字符,判断是否相同
        {
            s1++;
            s2++;
        }
        if (*s2 == '\0')//字符串2已经查找结束,说明找到了
        {
            return cur;
        }
        if (*s1 == '\0')//目的字符串已经查找完了,而要查找的字符串还没有完,说明没有找到
        {
            return NULL;
        }
        cur++;//如果上面的情况均不是,则cur++找目的字符串的下一个字符进行下一次对比
    }
}
int main()
{
    char arr1[10] = "abcdefg";
    char arr2[] = "cd";
    char* p=my_strstr(arr1,arr2);
    printf("%s",p );
    return 0;
    }

以上就是代码的具体实现和优化过程,欢迎━(*`∀´*)ノ亻!大家讨论!

字符串查找函数Strstr函数的实现(详细易懂)相关推荐

  1. C和指针之strcat函数 strchr函数 strcmp函数 strcpy函数 strnchr函数 strstr函数实现

    1  strcat函数实现 #include <stdio.h> //简单实现strcat函数 char *my_strcat(char *des, const char *src) {i ...

  2. C语言学习笔记---字符串查找函数strstr()和strpbrk()函数

    strstr()函数   C语言中如何向查找一个字符串中是否包含另一个字符串,可以使用strstr()函数.使用示例如下: int main(int argc, char *argv[]) {char ...

  3. 字符串函数剖析(3)---strstr函数

    1.strstr函数的巧妙 – 查找子字符串 1.1模拟实现strstr函数 strstr函数:在一个字符串中查找子串 学习新函数时,先去c库查找该函数的相关资料,更加助于你的学习 const cha ...

  4. strcmp,strcpy,strstr函数

    strcmp()函数 strcmp()函数用来比较两个字符串的大小 strcmp(字符串1,字符串2) 如果字符串1==字符串2,则函数值为0: 如果字符串1>字符串2,则函数值为一个正整数: ...

  5. python字符串怎么查找_python 字符串 查找 基本操作

    1.简介 ????字符串 相关操作 较多,本文 只简单描述下 python 字符串 查找 相关的基础操作 ???? 2.字符串 查找 内置函数 3.实例 ????获取 指定 公司 的相关信息(公司信息 ...

  6. linux c 字符串查找函数 strstr strcasestr

    一.strstr函数使用 [1] 函数原型 char *strstr(const char *haystack, const char *needle); [2] 头文件 #include <s ...

  7. C语言strstr()函数(在主字符串里查找子字符串,返回第一次找到的子字符串以及后面的字符串)

    需包含头文件:C 标准库 - <string.h> 文章目录 描述 声明 参数 返回值 实例 描述 C 库函数 char *strstr(const char *haystack, con ...

  8. C语言strstr()函数用法-字符串查找

    1.函数定义 strstr()函数是一个参数为两个字符指针类型,返回值是char*类型的函数. 用于找到子串(str2)在一个字符串(str1)中第一次出现的位置(不包括str2的串结束符),并返回该 ...

  9. 有意思的字符串查找函数strchr,strrchr,strstr,strrstr

    通过一段时间对字符串的了解,我发现了许多有意思的字符串函数,下面我们就以常见的字符串查找函数:strchr,strrchr,strstr,strrstr为例来模拟实现这些有意思的字符串查找函数吧! [ ...

最新文章

  1. 100多年了,左右大脑的不对称性依然备受关注
  2. Oracle数据库里面查询字符串类型的字段不为空和为空的SQL语句:
  3. android 过滤emoji表情符号,android怎样过滤字符串中的emoji表情
  4. 《零基础》MySQL 事务(二十二)
  5. sqlserver有外键无法创建触发器_数据库不使用外键的 9 个理由
  6. pythonturtle是标准库_Python常用标准库1-Turtle,Random,Time和Datetime
  7. android浏览器自动全屏,Android开发实现浏览器全屏显示功能
  8. python变量相关性,数据科学:定量和定性变量之间的相关性(python语言)
  9. mysql内表和外表_内表查询用到外表
  10. 学会感恩,学会分享,开始总结自己的职场经验
  11. 【开发日常】【Java】Java小程序汽车租赁
  12. Leetcode-1658. 将 x 减到 0 的最小操作数
  13. 从事网络安全,可以考取什么证书?
  14. 常见web中间件 HTTP 限制请求方法 配置
  15. 采购是份“好工作”吗?
  16. 怎么辨别nike真假
  17. 四种比较简单的图像显著性区域特征提取方法原理及实现
  18. 黑暗之光三部曲 黑暗之光三部曲小说
  19. 安卓手机如何下载ZOOM?
  20. c++ 包络谱分析代码_信号处理——Hilbert变换及谱分析

热门文章

  1. 哈夫曼编码解码课程设计源代码
  2. XTU 1264 Partial Sum 2017年“嘉杰信息杯” 中国大学生程序设计竞赛全国邀请赛(湖南)
  3. 印度初创公司推出 AI「视频墙」 ​监视 70 所监狱【智能快讯】
  4. js通过判断h5页面是否内嵌在app内
  5. Badusb制作及使用(渗透windows)
  6. SQL数据类型datetime
  7. 通道其实不难!Photoshop通道教程
  8. 谷歌浏览器打开时为桔梗网
  9. Java源码美风的网上花店商城系统
  10. error: ‘CV_RGB2GRAY’ was not declared in this scope 的解决方法