当前位置: 首页 > news >正文

C语言之strstr函数的使用和模拟实现

C语言之strstr函数的模拟实现

文章目录

  • C语言之strstr函数的模拟实现
    • 1. strstr函数的介绍
    • 2. strstr函数的使用
    • 3. strstr的模拟实现
      • 3.1 实现思路
      • 3.2 实现代码

1. strstr函数的介绍

函数声明如下:

char * strstr ( const char * str1, const char * str2 );    

strstr函数是用于在字符串str1中找str2字符串第一次出现的位置,如果找到改位置,则将这个位置返回,找不到则返回一个空指针NULL
strstr函数比较元素时,不包含 \0,以 \0 作为结束的标志

2. strstr函数的使用

#include <stdio.h>
#include <string.h>int main()
{char arr1[] = "abcadefdef";char arr2[] = "def";char * ret = strstr(arr1, arr2);if (ret != NULL){printf("%s\n", ret);}else{printf("找不到\n");}return 0;
}

如果arr1字符串中是否有arr2 def 这三个字符,必须得是连续的
然后用ret来接收strstr函数的返回值
如果arr1中有出现arr2这个字符串,则返回第一次出现的地址
否则则返回一个空指针
最后继续判断是否为空指针,如果不是则打印第一次出现的位置

运行结果如下:
在这里插入图片描述

3. strstr的模拟实现

3.1 实现思路

假设有两个字符数组
str1中的字符串为 a b b b c d e f \0
str2中的字符串为 b b c \0
在这里插入图片描述

当将这两个字符串传给strstr函数时,传入的是首元素地址,所以str1指向字符 a ,str2指向字符 b

  1. 要判断str1字符串中是否有str2字符串,首先,str1要从第一个元素开始比较,如果从第一个元素就错了,所以要通过指针偏移的方式来找到第二个元素,如果两个元素相同,那么str1 和 str2 都偏移一个字节找到下一对要比较的元素

  2. 当指针偏移到第二个元素的时候,当第二遍比较的时候,str1 和 str2 前两个字符都相同,此时str1指向第三个元素 b ,str2指向第二个元素 b ,然后str1 和 str2 都偏移一个字节找到下一个元素, str1 找到第四个元素 b,str2 找到第三个元素 c,此时两个元素不相同,str1 得回到比较时的位置,str2 得回到起始位置

3.所以我们可以定义两个指针变量用来记录str1比较时的位置,和str2的起始位置,假设为s1 和 s2
在这里插入图片描述

通过比较s1 和 s2 的元素,判断是否相符合,如果不符合s1 回到 str1的位置, s2回到 str2 的位置
然后str1++找到下一个元素,从这个元素开始比较,当s2指向\0的时候,则返回str1的地址,我们也可以定义一个cur来存放str1的地址,这样比较清晰一点

3.2 实现代码

#include <stdio.h>
#include <string.h>
#include <assert.h>char* my_strstr(const char* str1, const char* str2)
{const char* cur = str1;  //用cur用来记录当前的位置const char* s1 = NULL;   //通过s1 和 s2 比较元素const char* s2 = NULL;assert(str1 && str2);    //assert断言,如果传入的地址有有一个会空指针,则直接返回str1的地址if (str2 == '\0')return (char*)str1;while (*cur)   //当cur中的值不为'\0'时,进入循环{s1 = cur;   //s1回到比较时的位置s2 = str2;  //s2回到初始位置while (*s1 == *s2) //当s1和s2指向的值相等时,进入循环{s1++;  //找到下一个元素s2++;  //找到下一个元素//再次比较}if (*s2 == '\0')  //当s2中的元素为'\0'时,则说明在str1中找到了str2return (char*)cur; //返回当前的位置cur++; //第一次没找到,找到下一个元素重新寻找}return NULL; //如果在循环中没有找到,则返回一个空指针
}int main()
{char arr1[] = "abcadefdef";char arr2[] = "def";char* ret = my_strstr(arr1, arr2);if (ret != NULL){printf("%s\n", ret);}else{printf("找不到\n");}return 0;
}

运行结果如下:
在这里插入图片描述

相关文章:

  • 《数据结构、算法与应用C++语言描述》-代码实现散列表(线性探查与链式散列)
  • 在AWS VPC中运行Nagios检查时指定自定义DNS解析器的选项
  • 7-22 龟兔赛跑
  • SpringBoot——拦截器
  • 【沐风老师】在3dMax中如何把对象随机散布在表面上?
  • 40、Flink 的Apache Kafka connector(kafka source 和sink 说明及使用示例) 完整版
  • 介绍 Docker 的基本概念和优势,以及在应用程序开发中的实际应用。
  • [原创](免改BIOS)使用Clover升级旧电脑-(高阶玩法)让固态硬盘内置Win11 PE启动系统
  • 【ArcGIS Pro微课1000例】0034:矢量数据几何校正案例(Spatial Adjustment)
  • 微服务学习|初识Docker、使用Docker、自定义镜像、DockerCompose、Docker镜像仓库
  • java反序列化漏洞详解
  • requests库的学习(详细篇)
  • 实例讲解Simulink的MATLAB Function模块
  • git本地账户如何从一台电脑迁移到另外一台
  • mac 修改 hosts 文件
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • AHK 中 = 和 == 等比较运算符的用法
  • Android Volley源码解析
  • AngularJS指令开发(1)——参数详解
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • javascript 总结(常用工具类的封装)
  • js
  • MobX
  • mysql外键的使用
  • python学习笔记 - ThreadLocal
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • Unix命令
  • webgl (原生)基础入门指南【一】
  • 阿里云应用高可用服务公测发布
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 给Prometheus造假数据的方法
  • 基于 Babel 的 npm 包最小化设置
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 使用common-codec进行md5加密
  • 学习JavaScript数据结构与算法 — 树
  • 一个项目push到多个远程Git仓库
  • 源码安装memcached和php memcache扩展
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • ​1:1公有云能力整体输出,腾讯云“七剑”下云端
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • # windows 安装 mysql 显示 no packages found 解决方法
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #Spring-boot高级
  • (ISPRS,2021)具有遥感知识图谱的鲁棒深度对齐网络用于零样本和广义零样本遥感图像场景分类
  • (k8s)kubernetes 部署Promehteus学习之路
  • (LLM) 很笨
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (PySpark)RDD实验实战——取一个数组的中间值
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (安卓)跳转应用市场APP详情页的方式
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (二十三)Flask之高频面试点
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统