模拟实现strstr函数

2023-11-04

目录

strstr函数介绍:

使用strstr:

出现:

 未出现:

我的strstr模拟实现:

代码:

代码逻辑:

现在来讲一下比较迷惑的点:

结语:


strstr函数介绍:

    在C语言的库函数里面有一个函数叫做strstr(),这个函数的作用是在一个字符串中判断是否存在某一个字符串。

Cplusplus网站上对strstr函数的介绍是这样的:

 这段解释提供了几个比较关键的信息:

1.这个函数的返回类型是char*

2.如果在str1里面存在str2那就返回str2中的第一个字符的地址。

3.如果在str1中不存在str2那就返回一个NULL.

4.还有就是实现这个函数的模板。

使用strstr:

出现:

 未出现:

我的strstr模拟实现:

代码:

char* my_strstr(const char* str1,const char* str2){
	char* s1 = (char*)str1;
	char* s2 = (char*)str2;
	char* cp = str1;
	while (*cp) {
		s1 = cp;
		s2 = (char*)str2;
		
		while(*s1 && *s2 && *s1 == *s2) {
			s1++;
			s2++;
		}
		if (*s2 == '\0') {
			return cp;
		}
		cp++;
	}
	return NULL;
}

代码逻辑:

1.先定义三个指针变量指向str1,str2,str1。cp指针有标记的作用(标记s1的下一个元素)。

2.进入到循环中,循环条件是*cp不等于’\0'

3.在第一次循环未能成功找出时并且*cp不等于'\0'时,将cp的地址赋值给s1(此时s1指向了下一个元素,以下一个元素为起点进行寻找);s2的地址重新指向str2(字符串str2的首地址)

4.第二个while循环内的循环条件是s1与s2指向的元素相等且两者指向的元素都不是'\0'。如果这个循环结束那就有三种可能性:

1.s1与s2指向的内容不相等

2.*s1=='\0' 与*s2都等于’\0'

3.*s1与*s2中有一个等于'\0'

5.使用if进行判断,如果在第二个while循环结束以后*s2指向的是'\0'那就是找到了。如果不是那就调整s1指向cp所指向的元素,s2重新指向首元素,再次进行寻找。

6.大循环结束了还没找到的话那就返回NULL.

到这里,我就把我实现my_strstr函数的逻辑讲清楚了。

现在来讲一下比较迷惑的点:

char* my_strstr(const char* str1,const char* str2)
char* s1 = (char*)str1;
char* s2 = (char*)str2;

不知各位看官是否有注意到这里进行了两次强制转换,这里的原因在于str1与str2的前面有一个const修饰符对str1与str2进行限定,所以str1与str2的是比较安全的。当你把char*型的s1与s2指向str1与str2时就相当于用一个没有那么安全的指针指向了一个比较安全的指针,编译器(VS2019)就会报警告,所以为了不报警告我就把str1与str2强制类型转换为char*型。

结语:

好了,今天的分享就到这里了。感谢你的阅读,如果你心情好的话给小牛儿来个三连啊,哈哈哈。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

模拟实现strstr函数 的相关文章

  • Finalshell连接Linux超时之Connection timed out: connect

    BUG原因 每次重启finalshell 还是 CentOS ip地址存在变化的可能 目录 前言 报错 摸索 解决措施 前言 1 福利 花了2小时才解决的BUG 希望本篇文章能帮你10分钟解决 2 tips ipconfig或ip addr
  • cp can‘t stat ..........

    在我把usr src linux source 5 13 0 tar bz2复制的时候出现了错误 就是这个提示 cp cannot stat linux source 5 13 0 tar bz2 No such file or direc
  • Linux性能调优之sar详解

    什么是sar sar是一个采集 报告和存储计算机负载信息的工具 有的时候 我们要通过对系统的cpu负载等性能数值的查看 来判排查系统产生某种故障 经常死机或者运行速度突然变慢 的原因 但是 简单的top uptime w等命令只可以查看当前
  • linux :ubuntu 安装搜狗输入法

    1 安装Fcitx输入框架 sudo apt install fcitx 2 搜狗输入法官网下载Linux版本搜狗输入法 32位和64位根据自己情况 3 输入指令安装 sudo dpkg i sogoupinyin 2 3 1 0112 a
  • 虚拟机的内存泄漏和内存溢出

    文章目录 内存泄漏 内存溢出 集合引起的内存泄漏 内存泄漏 内存泄漏的根本原因是长生命周期的对象持有短生命周期对象的引用 尽管短生命周期的对象已经不再需要 但由于长生命周期对象持有它的引用而导致不能被回收 以发生的方式来分类 内存泄漏可以分

随机推荐

  • google protobuf使用

    http www cnblogs com youxin p 4073703 html If you get the source from github you need to generate the configure script f
  • chatgpt赋能python:如何实现Python代码执行完后再执行

    如何实现Python代码执行完后再执行 当我们在编写Python代码时 可能会需要在代码执行完之后再执行一些任务 这种情况非常常见 例如在爬虫中 可能需要在爬取完网页内容后再将其存入数据库 Python提供了多种方法来实现这个目的 方法一
  • 嵌入式开发之堆栈调试打印

    简介 打印堆栈的常用方法包括 glibc中的backtrace函数 gcc内置函数 builtin return address 第三方库libunwind 1 glibc中的backtrace 1 1函数原型 include
  • 如何设置ppt,使讲演者看到备注,而观众看不到(很好,很实用!)

    前言 大家在看此篇文章之前心中是不是一直存有一个疑问 那就是office组件中的powerpoint PPT 制作中的 备注 到底有何作用 在工作中经常用PPT放映演示给客户进行讲演 也见识过专业讲师和IT销售给我介绍产品 使用的也是 PP
  • AD查询1000条限制和解决方案

    http www riaos com ria 11639 公司的一个项目要从AD上取数据 为了测试性能 批量在AD上创建了2000多个用户 但是用java程序获取所有用户的时候会报错或者只能取到1000条数据 用com novell lda
  • Hash函数

    Hash函数 1 数据完整性 2 Hash函数 1 Hash函数定义 2 Hash函数的应用 3 Hash函数的基本要求 4 Hash函数的安全性 5 随机预言机ROM 6 ROM中的三个算法 1 原像问题 2 第二原像问题 3 碰撞问题
  • uni-app ——小程序购物车基本功能的实现过程

    文章目录 前言 一 示例图 二 实现步骤 1 实现思路 2 静态页面的搭建 3 css样式 4 使用vuex操作相关数据 总结 一 示例图 二 实现步骤 1 实现思路 关于实现思路在初次使用JS实现购物车时就有所讲解 其实实现思路都大致相同
  • 【FFmpeg学习笔记一】FFmpeg简介

    Fmpeg简介 一 FFmpeg简介 二 FFmpeg函数库 三 FFmpeg用例 四 相关链接 一 FFmpeg简介 FFmpeg是一款自由软件 核心功能就是音视频编解码 其中的 FF 指的是 Fast Forward 快速前进 FFmp
  • Shamir秘密共享 与 ElGamal门限解密

    Secret sharing scheme 定义 秘密共享方案是可有效计算的是算法组 G C G C G C 定义为
  • (实验50)单片机,STM32F4学习笔记,代码讲解【串口IAP实验】【正点原子】【原创】

    文章目录 2023重新理解记录 其它文章链接 独家吐血整理 实验现象 主程序 IAP初始化程序 代码讲解 2023重新理解记录 BOOT APP Flash boot是通信使用 APP是功能代码 平时烧录的文件 hex时boot与app的结
  • canopen服务器协议,CANOpen协议如何保证通讯不丢帧?-通信/网络-与非网

    摘要 如何让现场总线通讯更加稳定可靠 不丢失 这向来都是工程师们难以解决的问题 本文将运用国际规范的通讯协议来展示怎样才能搭建好握手通讯 服务数据对象 SDO Service data object SDO 主要用于 CANopen 主站对
  • Android(安卓) 无线ADB调试手机(WiFi 调试、蓝牙调试)

    1 手机和电脑连接同一局域网 连同一个 WiFi 手机开热点电脑连接 电脑开热点手机连接 2 手机打开USB调试模式 3 查找你需要连接的Android 安卓 设备的ip 方式一 手机开热点电脑连接 手机分享蓝牙网络给电脑连接 1 电脑打开
  • template might not exist or might not be accessible by any of the configured Template Resolvers

    这个报错是找不到模板的存放路径 看配置 模板应该是在resource目录下 问题解决 参考 https blog csdn net qq 33605879 article details 107595510
  • ES(Elasticsearch)7.6.1安装教程

    Es elasticsearch 7 6 1安装教程 注意 除了最后启动ES的时候在es账户下执行 其他都是在root 下执行的 相关文件的下载 我这里都有 百度网盘链接 https pan baidu com s 1PxgINf6Q1UZ
  • Anaconda进出虚拟环境

    用了很多次还是总忘 记一下 查看Python环境 conda info env 代表当前环境 创建虚拟环境 pip create n py37 python 3 7或 conda create n py37 python 3 7 Windo
  • kibina 启动_kibana启动失败

    log 09 44 53 848 info listening server http Server running at http localhost 5601 log 09 44 53 864 error status plugin x
  • 给定区间[-2^31, 2^31]内的3个整数A、B和C,请判断A+B是否大于C。

    该题使用long double作为A B C的存储类型 都无法通过系统的测试 但是本地测试通过了 系统测试使用 BigInteger 通过测试了 为甚么会出现这个结果 这里面到底是什么原因 本人也没搞清楚 如有大神明白其中原理 希望多多指教
  • python装13的一些写法

    一些当你离职后 让老板觉拍大腿的代码 1 any in for in 判断某个集合元素 是否包含某个 某些元素 代码 if name main 判断 list1 中是否包含某个 某些元素 list1 1 2 3 4 a any x in 5
  • matlab 画折线图

    针对这篇博客里有些不够详细的地方 后期又写了一个稍微更详细的MATLAB画折线图 https blog csdn net Rhiney 97 article details 105000137 代码 效果图 x 1 1 5就是x轴上的数据
  • 模拟实现strstr函数

    目录 strstr函数介绍 使用strstr 出现 未出现 我的strstr模拟实现 代码 代码逻辑 现在来讲一下比较迷惑的点 结语 strstr函数介绍 在C语言的库函数里面有一个函数叫做strstr 这个函数的作用是在一个字符串中判断是