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中,浏览器和服务器只需要完成一次握手,两者之间就直接…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...

10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...