字符串匹配--strstr函数的模拟实现思路和代码
一,strstr函数
原型:
const char * strstr ( const char * str1, const char * str2 );char * strstr ( char * str1, const char * str2 );
strstr是一个字符串匹配函数,在str1中去寻找str2,如果找到,返回str2在str1中第一次出现的起始位置,没找到就返回空。
在C库中strstr的实现也是使用的暴力算法,所以我们此处也是使用暴力算法来模拟实现。
当然关于字符串匹配的问题还有两个比较出名的算法KMP和BM这两个算法不在此文章介绍,后面会出文章介绍这两种算法,注意,暴力算法不一定是比KMP算法地效的,实际应用时暴力算法的效率大多是比KMP要高的。
二,实现思路
先来看一下动图是怎么走的,然后再来解释具体的过程。

- 起始两个指针都指向的是各字符串的起始字符。
- 开始比较,若对应字符不同,仅移动模式串的指针,使其指向下一个字符。
- 若对应字符相同,两指针同时进行++(开始匹配),指向下一个字符。如是在此过程中,又发生了不匹配的情况,那么字串的指针回到字串的起始位置,模式串指针回到开始匹配的下一个位置。
基于上面模式串要记录开始匹配的位置,我们还需要引入一个指针来记录每一次开始匹配的位置,该指针起始时等于模式串指针。当在匹配的过程中发生中断,就需要该指针++后赋值给模式串指针,让其走到开始匹配位置的下一个字符位置。
代码:
#include <stdio.h>
#include <string.h>char* my_strstr(char* str1, const char* str2)
{//暴力匹配算法char* p0 = str1, * p1 = str1;//p0记录p1开始匹配的起始位置, p1模式串const char* p2 = str2;//字串while (*p1 != '\0'){while (*p1 == *p2 && *p2 != '\0'){p1++;p2++;}if (*p2 == '\0')//匹配成功,返回位置return p0;p1 = ++p0;p2 = str2;}return 0;
}
int main()
{char arr[] = { "caaabcdefgabf" };char* ret = my_strstr(arr, "aab");printf("%s\n", ret);return 0;
}
运行结果:
如有不足,欢迎补充OvO!
相关文章:
字符串匹配--strstr函数的模拟实现思路和代码
一,strstr函数 原型: const char * strstr ( const char * str1, const char * str2 );char * strstr ( char * str1, const char * str2 ); strstr是一个字符串匹配函数,在str1中去寻找str2,如果找到,返回str2在…...
【ArcGIS Pro二次开发】(7):地图(Map)的基本操作
地图是ArcGIS Pro中的基础起点,也是大多数工程的基础。主要用于显示表示空间数据的图层。 一、地图(Map)的基本操作示例 1、获取当前地图 var map MapView.Active.Map; 2、获取一级图层 var lys map.Layers; 用于获取地图中的单一图层,以及图层组…...
python 自动化测试 pytest 的使用
pytest 是一款以python为开发语言的第三方测试,主要特点如下: 比自带的 unittest 更简洁高效,兼容 unittest框架 支持参数化 可以更精确的控制要测试的测试用例 丰富的插件,已有300多个各种各样的插件,也可自定义扩…...
闭包(回顾)
概念作用保护作用保存作用优缺点命名空间 概念 闭包(closure)指有权访问另一个函数作用域中变量的函数 — Javacript高级程序设计 p309 简单理解,一个作用域可以访问另一个函数内部的私有变量 // 其中 test就是一个闭包 function fn(){var num 10function test …...
利用好这两个方法,服务型企业缺成本票不再难解决!
现代服务业属于人才密集型和技术型类别,其中囊括了不少技术,知识,智力服务等产业:信息技术,文化创意,营销策划,广告设计,以及咨询,商务和法律服务。 在金税三期完善之前…...
前端面试编程题(异步调度,Promise实现、占用空间大小、渲染虚拟节点、实现for of)
目录 异步调度问题 题目一 答案 题目二 答案 递归输出 题目一 答案 Promise相关 题目一 答案 占用空间大小 题目一 答案 渲染虚拟节点 题目一 答案 实现for of 题目一 答案 异步调度问题 题目一 1.实现一个带并发限制的异步调度Scheduler,保证同…...
复旦团队发布国内首个模型MOSS 类ChatGPT
复旦团队发布国内首个模型MOSS 类ChatGPT 首先看到这个标题,还有这个名字,我是正经(zhen jing)的 (bu shi 流浪地球?550W?不了解的可以把550W倒过来写,就懂了 看到新闻里的一些图…...
5.35 综合案例2.0 -称重数据上传云端
综合案例2.0 - 称重数据上传云端案例说明连线功能实现1.阿里云平台连接代码应用开发3.1新建‘普通项目’3.2关联产品和设备3.3新建‘移动应用’3.4添加组件3.5配置组件信息3.6保存预览案例说明 使用hx711串口模块称重,结合IOT studio制作手机APP远程控制并采集物体重量。 hx7…...
如何让人机对话更自然?
来源:投稿 作者:顾相欢 编辑:学姐 AAAI-2022|定制对话的人设和知识背景 原文标题: Call for Customized Conversation: Customized Conversation Grounding Persona and Knowledge 原文链接: https://arxiv.org/ab…...
Python每日一练(20230224)
目录 1. 列表奇偶拆分 ★ 2. 二叉树的后序遍历 ★★ 3. 接雨水 ★★★ 附录 二叉树 特点 性质 特殊二叉树 满二叉树 完全二叉树 完全二叉树性质 二叉树的遍历 1. 列表奇偶拆分 【问题描述】 输入一个列表,包含若干个整数(允许为空ÿ…...
【Linux】-- Shell的运行原理、Linux当中的权限
目录 Shell的运行原理 Linux权限的概念 su命令 权限 文件访问权限的相关设置方法 chmod指令 chown指令 chgrp指令 sudo命令 文件的常见问题 umask 粘滞位 关于权限的总结 Shell的运行原理 Shell运行原理 —— 外壳程序。 Linux严格意义上说的是一个操作系统&…...
MOS管选型参数:VGS(th)
MOS管选型参数:VGS(th) VGS(th):开启电压(阀值电压)。当外加栅极控制电压 VGS 超过 VGS(th) 时,漏区和源区的表面反型层形成了连接的沟道。应用中,常将漏极短…...
二.线性表之顺序表
文章目录前言一.顺序表的概念及结构二.顺序表的接口实现1.顺序表的动态存储2.顺序表的初始化3.顺序表尾插#封装:扩容函数4.顺序表尾删5.顺序表头插6.顺序表头删7.顺序表查找8.顺序表在pos位置插入x9.顺序表删除pos位置的值10.顺序表销毁11.顺序表打印三.源1.Seqlist…...
ElasticSearch - SpringBoot整合ElasticSearch实现文档的增删改
文章目录1. ElasticSearch和kibana的安装和配置2. SpringBoot 项目环境搭建3. 创建索引4. 索引文档5. 更新文档6. 删除文档https://www.elastic.co/guide/en/elasticsearch/reference/current/search-your-data.htmlhttps://www.elastic.co/guide/cn/elasticsearch/guide/curre…...
JavaScript 库
文章目录JavaScript 库JavaScript 框架(库)jQueryPrototypeMooTools其他框架CDN -内容分发网络引用 jQuery使用框架JavaScript 库 JavaScript 库 - jQuery、Prototype、MooTools。 JavaScript 框架(库) JavaScript 高级程序设计…...
云解析DNS为什么要配置默认线路?
传统解析技术不会判断访客IP,而是会随机选择一个IP返回给访问者,这样就有可能造成移动用户访问电信服务器IP,北京用户访问深圳服务器IP这种跨域跨网访问的情况,产生非常大的延迟,带来很不好的访问体验。 而云解析DNS会…...
Linux命令之awk
awk是一个有强大的文本格式化能力的linux命令,早期是在Unix上实现的,linux后来也可以使用了,我们在Linux上使用的awk是gawk(GNU awk的意思) 语法 awk [option] 模式{动作} file option表示awk的可选参数,可…...
实战-缓存数据一致+binlog初始+cannel监听+数据迁移,数据一致性架构设计
前言 一. 解决缓存不命中(高并发操作击穿打挂DB的风险) 当并发量打的时候,当我们的缓存过期时,就算到数据库的比例偏小的时候,我们的请求时比较大的。那也会存在数据库崩掉的情况。解决方案想法如下(总体…...
nginx配置中proxy_pass反向代理502的bug
记录一个坑人的bug, 我今天在一台新的liunx上运行nginx来进行反向代理时候,发现怎么测都是502 我把配置全部删了从头开始配置,发现80端口正常,80端口index.html正常,反向代理转向http://127.0.0.1/也正常,…...
JavaScript 两种方案打开文件对话框
JavaScript 两种方案打开文件对话框 文章目录JavaScript 两种方案打开文件对话框一、文件对话框二、传统方案表单元素🌈三、文件系统访问API💦四、更进一步使用六、代码仓库🌐七、参考资料💘七、推荐博文🍗一、文件对话…...
[Python3高阶编程] - [Python3高阶编程] - 异步编程深度学习指南三:手动实现AsyncRLock
一、手动实现 AsyncRLockimport asyncio from typing import Optionalclass AsyncRLock:def __init__(self):self._lock asyncio.Lock() # 底层互斥锁self._owner: Optional[asyncio.Task] None # 当前持有锁的协程(Task)self._count 0 …...
DOL-CHS-MODS整合包零基础精通指南:从安装到定制全方位教程
DOL-CHS-MODS整合包零基础精通指南:从安装到定制全方位教程 【免费下载链接】DOL-CHS-MODS Degrees of Lewdity 整合 项目地址: https://gitcode.com/gh_mirrors/do/DOL-CHS-MODS 项目价值定位 DOL-CHS-MODS作为Degrees of Lewdity的中文整合方案࿰…...
量化交易backtrader实践(二)_数据预处理篇(1)_格式转换与清洗
1. 数据预处理的重要性 在量化交易中,数据预处理就像做菜前的食材准备阶段。想象一下,如果你要做一道红烧肉,却直接拿刚从冰箱取出的冻肉下锅,结果可想而知。同样地,未经处理的原始金融数据直接喂给backtrader…...
基于离散化方法的三维土豆运动微波加热案例:参数化扫描与继承解算子实现离散化
基于离散化方法三维土豆运动微波加热的案例——第一种方法参数化扫描和继承解的算子实现离散化 离散化方式是最常见的实现运动仿真的方法之一,实现离散化的方法有很多,对于COMSOL主要的离散化及种 目前我研究了三种实现离散化的方法,这三种方…...
Kandinsky-5.0-I2V-Lite-5s代码实例:Python调用API与前端交互实操解析
Kandinsky-5.0-I2V-Lite-5s代码实例:Python调用API与前端交互实操解析 1. 模型简介与核心能力 Kandinsky-5.0-I2V-Lite-5s是一款轻量级图生视频模型,它能够将静态图片转化为动态视频内容。只需提供一张首帧图片和简单的运动描述,模型就能生…...
【数字电路】从双稳态到触发器:时序逻辑的存储基石
1. 数字世界的记忆细胞:双稳态电路探秘 当你按下电脑电源键的瞬间,数十亿个微型存储单元开始工作,它们就像数字世界的记忆细胞,忠实地记录着每一个比特的信息。这一切的起点,正是我们今天要探讨的双稳态电路。想象一下…...
Conda环境回滚实战:当安装新包搞崩base环境时如何一键恢复
Conda环境回滚实战:当安装新包搞崩base环境时如何一键恢复 在Python开发中,conda作为包管理和环境管理的利器,几乎成为数据科学家的标配工具。但越是频繁使用conda,越容易遇到一个令人头疼的问题——在base环境中安装新包后&#…...
代码重构的艺术:在业务狂奔中如何优雅地还技术债
业务压力下的质量困局在快节奏的软件开发世界中,业务需求如同永不停歇的浪潮,推动着团队高速前行。为了抢占市场先机、快速响应变化,“先上线,再优化”几乎成了许多项目的默认模式。然而,这种模式背后,是以…...
CSS 容器查询:组件级响应式设计
CSS 容器查询:组件级响应式设计代码如诗,容器如画。让我们用容器查询的强大能力,创建真正自适应的组件。什么是容器查询? 容器查询(Container Queries)是 CSS 中一项革命性的特性,它允许我们根据…...
3步实现AI智能背景移除:开源工具让透明GIF制作变得如此简单
3步实现AI智能背景移除:开源工具让透明GIF制作变得如此简单 【免费下载链接】backgroundremover Background Remover lets you Remove Background from images and video using AI with a simple command line interface that is free and open source. 项目地址:…...
