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
-
要判断str1字符串中是否有str2字符串,首先,str1要从第一个元素开始比较,如果从第一个元素就错了,所以要通过指针偏移的方式来找到第二个元素,如果两个元素相同,那么str1 和 str2 都偏移一个字节找到下一对要比较的元素
-
当指针偏移到第二个元素的时候,当第二遍比较的时候,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语言之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 ); strs…...
【间歇振荡器2片555时基仿真】2022-9-24
缘由multisim出现这个应该怎么解决吖,急需解决-嵌入式-CSDN问答 输出一定要有电阻分压才能前后连接控制否则一定报错。...
MySQL与PostgreSQL 的一些SQL
MySQL 1、MYSQL输出重定向 将SQL内容输出到文件 nohup mysql -h127.0.0.1 -uroot -ppassword -Ne "sql语句;" > /home/mysql/data/xxxxx.txt &2、时间格式转换 时间转换,转10位时间戳 select UNIX_TIMESTAMP(2021-02-27 00:00:00)SELECT …...
Spring 七大组件
文章目录 Spring 七大组件 Spring 七大组件 核心容器(Spring core) 核心容器提供Spring框架的基本功能。Spring以bean的方式组织和管理Java应用中的各个组件及其关系。Spring使用BeanFactory来产生和管理Bean,它是工厂模式的实现。BeanFactory使用控制反转(IOC)模式…...
【UGUI】实现跑酷游戏分数血量显示在UI中
//1.实现让玩家的金币分数显示在UI文本中 2.让血量和滑动条关联起来 这一节课主要学会获取组件并改变属性,举一反三! using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using TMPro;//1.实现让玩…...
Vue和React对比
Vue和React都是流行的前端JavaScript框架,它们有很多相似点和不同点,以下是它们的优缺点。 相似点: 都使用了组件化的开发模式,使得应用程序更易于理解和维护。都支持虚拟DOM,提高了页面重绘性能。都支持模板化编程方…...
iPhone的实时照片不能直接查看,但有不少替代方法可以查看
苹果在iPhone 6s和iPhone 6s Plus上推出了实时照片(livp)功能,该功能也出现在最新的iPhone中。正如你所知,实时照片功能是电影和静态图像的混合。也就是说,实时照片既不是照片也不是视频。 当你在iPhone上拍摄实时照片时,iOS会创建一个MOV文件和一个JPEG文件。 如果你…...
弹窗msvcp140_1.dll丢失的解决方法,超简单的方法分享
在计算机使用过程中,我们经常会遇到一些错误提示,其中最常见的就是缺少某个文件的错误。最近,我在使用某些软件时,遇到了一个名为“msvcp140_1.dll”的错误提示。这个错误通常出现在运行某些程序时,由于缺少了msvcp140…...
人工智能基础_机器学习047_用逻辑回归实现二分类以上的多分类_手写代码实现逻辑回归OVR概率计算---人工智能工作笔记0087
然后我们再来看一下如何我们自己使用代码实现逻辑回归的,对二分类以上,比如三分类的概率计算 我们还是使用莺尾花数据 首先我们把公式写出来 def sigmoid(z): 定义出来这个函数 可以看看到这需要我们理解OVR是如何进行多分类的,我们先来看这个 OVR分类器 思想 OVR(One-vs-…...
Interactive Visual Data Analysis
Words&Contents Home | Interactive Visual Data Analysis Book Outline 这本书对视觉、互动和分析方法进行了系统而全面的概述,作为数据可视化方面比较好的读物; 目录 Words&Contents Book Outline (一)Introduct…...
Prometheus监控mysql nginx tomcat 黑盒监控
部署consul_exporter,用与服务发现 https://github.com/prometheus/consul_exporter/releases/download/v0.9.0/consul_exporter-0.9.0.linux-amd64.tar.gz 注册 ootubuntu20:~# cat consul_export.json rootubuntu20:~# cat consul_export.json {"service…...
Altium Designer学习笔记12
把几个层理解下: layer名称功能说明信息Toplayer信号层铜箔层,电气连接的层Bottomlayer信号层铜箔层,电气连接的层Internal Planes内层连接地和电源上,一般情况下不布线,是由整片铜膜组成的Mechanical 1机械层电路板机…...
csrf跨站请求伪造详解
【1】csrf跨站请求伪造的解释及解决方法 CSRF(Cross-Site Request Forgery)跨站请求伪造是一种常见的网络攻击方式。攻击者通过诱导受害者访问恶意网站或点击恶意链接 将恶意请求发送到目标网站上利用受害者在目标网站中已登录的身份来执行某些操作从而…...
GitLab的个人仓库转移到团队仓库
文章目录 一、Gitlab权限二、转移2.1、编辑个人仓库2.2、Transfer project2.3、切换Namespace2.4、确认修改 一、Gitlab权限 Gitlab用户在组中有五种权限:Guest、Reporter、Developer、Master、Owner Guest:可以创建issue、发表评论,不能读写…...
Linux:Ubuntu实现远程登陆
1、查看sshd服务是否存在 Ubuntu默认是没有安装sshd服务的,所以,无法远程登陆。 检查22端口是否存在 netstat -anp 该命令执行后,查看不到22端口的进程。 如果netstat无法使用,我们需要安装一下netstat服务 sudo apt-get install…...
Unity中Shader的Standard材质解析(二)
文章目录 前言一、我们对 Standard 的 PBR 的 GI 进行解析1、我们先创建一个PBR的.cginc文件,用于整理用到的函数2、然后在Standard的Shader中引用该cginc文件 二、依次整理函数到该cginc文件中我们来看一下PBR中GI的镜面反射做了些什么 二、最终代码.cginc代码&…...
【Python 训练营】N_5 斐波那契数列
题目 输出斐波那契数列 分析 斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……。 在数学上,费波那契数列是以递归的方法来定义ÿ…...
x-www-form-urlencoded的含义解释,getReader()和getParameter()的区别
1、x-www-form-urlencoded x-www-form-urlencoded是一种编码格式,它是一种常见的编码方式,用于在HTTP请求中 传输表单数据 。在这种编码方式下,表单数据被编码为URL格式,然后作为请求体(payload)发送。 需要…...
python每日一题——3最长连续序列
题目 给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1: 输入:nums [100,4,200,1,3,2] 输出…...
什么?Postman也能测WebSocket接口了?
01 WebSocket 简介 WebSocket是一种在单个TCP连接上进行全双工通信的协议。 WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
