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

字符串匹配--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函数的模拟实现思路和代码

一&#xff0c;strstr函数 原型&#xff1a; const char * strstr ( const char * str1, const char * str2 );char * strstr ( char * str1, const char * str2 ); strstr是一个字符串匹配函数&#xff0c;在str1中去寻找str2&#xff0c;如果找到&#xff0c;返回str2在…...

【ArcGIS Pro二次开发】(7):地图(Map)的基本操作

地图是ArcGIS Pro中的基础起点&#xff0c;也是大多数工程的基础。主要用于显示表示空间数据的图层。 一、地图(Map)的基本操作示例 1、获取当前地图 var map MapView.Active.Map; 2、获取一级图层 var lys map.Layers; 用于获取地图中的单一图层&#xff0c;以及图层组…...

python 自动化测试 pytest 的使用

pytest 是一款以python为开发语言的第三方测试&#xff0c;主要特点如下&#xff1a; 比自带的 unittest 更简洁高效&#xff0c;兼容 unittest框架 支持参数化 可以更精确的控制要测试的测试用例 丰富的插件&#xff0c;已有300多个各种各样的插件&#xff0c;也可自定义扩…...

闭包(回顾)

概念作用保护作用保存作用优缺点命名空间 概念 闭包(closure)指有权访问另一个函数作用域中变量的函数 — Javacript高级程序设计 p309 简单理解&#xff0c;一个作用域可以访问另一个函数内部的私有变量 // 其中 test就是一个闭包 function fn(){var num 10function test …...

利用好这两个方法,服务型企业缺成本票不再难解决!

现代服务业属于人才密集型和技术型类别&#xff0c;其中囊括了不少技术&#xff0c;知识&#xff0c;智力服务等产业&#xff1a;信息技术&#xff0c;文化创意&#xff0c;营销策划&#xff0c;广告设计&#xff0c;以及咨询&#xff0c;商务和法律服务。 在金税三期完善之前…...

前端面试编程题(异步调度,Promise实现、占用空间大小、渲染虚拟节点、实现for of)

目录 异步调度问题 题目一 答案 题目二 答案 递归输出 题目一 答案 Promise相关 题目一 答案 占用空间大小 题目一 答案 渲染虚拟节点 题目一 答案 实现for of 题目一 答案 异步调度问题 题目一 1.实现一个带并发限制的异步调度Scheduler&#xff0c;保证同…...

复旦团队发布国内首个模型MOSS 类ChatGPT

复旦团队发布国内首个模型MOSS 类ChatGPT 首先看到这个标题&#xff0c;还有这个名字&#xff0c;我是正经&#xff08;zhen jing&#xff09;的 &#xff08;bu shi 流浪地球&#xff1f;550W&#xff1f;不了解的可以把550W倒过来写&#xff0c;就懂了 看到新闻里的一些图…...

5.35 综合案例2.0 -称重数据上传云端

综合案例2.0 - 称重数据上传云端案例说明连线功能实现1.阿里云平台连接代码应用开发3.1新建‘普通项目’3.2关联产品和设备3.3新建‘移动应用’3.4添加组件3.5配置组件信息3.6保存预览案例说明 使用hx711串口模块称重,结合IOT studio制作手机APP远程控制并采集物体重量。 hx7…...

如何让人机对话更自然?

来源&#xff1a;投稿 作者&#xff1a;顾相欢 编辑&#xff1a;学姐 AAAI-2022|定制对话的人设和知识背景 原文标题&#xff1a; Call for Customized Conversation: Customized Conversation Grounding Persona and Knowledge 原文链接&#xff1a; https://arxiv.org/ab…...

Python每日一练(20230224)

目录 1. 列表奇偶拆分 ★ 2. 二叉树的后序遍历 ★★ 3. 接雨水 ★★★ 附录 二叉树 特点 性质 特殊二叉树 满二叉树 完全二叉树 完全二叉树性质 二叉树的遍历 1. 列表奇偶拆分 【问题描述】 输入一个列表&#xff0c;包含若干个整数&#xff08;允许为空&#xff…...

【Linux】-- Shell的运行原理、Linux当中的权限

目录 Shell的运行原理 Linux权限的概念 su命令 权限 文件访问权限的相关设置方法 chmod指令 chown指令 chgrp指令 sudo命令 文件的常见问题 umask 粘滞位 关于权限的总结 Shell的运行原理 Shell运行原理 —— 外壳程序。 Linux严格意义上说的是一个操作系统&…...

MOS管选型参数:VGS(th)

MOS管选型参数&#xff1a;VGS(th) VGS&#xff08;th&#xff09;&#xff1a;开启电压&#xff08;阀值电压&#xff09;。当外加栅极控制电压 VGS 超过 VGS&#xff08;th&#xff09; 时&#xff0c;漏区和源区的表面反型层形成了连接的沟道。应用中&#xff0c;常将漏极短…...

二.线性表之顺序表

文章目录前言一.顺序表的概念及结构二.顺序表的接口实现1.顺序表的动态存储2.顺序表的初始化3.顺序表尾插#封装&#xff1a;扩容函数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 框架&#xff08;库&#xff09;jQueryPrototypeMooTools其他框架CDN -内容分发网络引用 jQuery使用框架JavaScript 库 JavaScript 库 - jQuery、Prototype、MooTools。 JavaScript 框架&#xff08;库&#xff09; JavaScript 高级程序设计…...

云解析DNS为什么要配置默认线路?

传统解析技术不会判断访客IP&#xff0c;而是会随机选择一个IP返回给访问者&#xff0c;这样就有可能造成移动用户访问电信服务器IP&#xff0c;北京用户访问深圳服务器IP这种跨域跨网访问的情况&#xff0c;产生非常大的延迟&#xff0c;带来很不好的访问体验。 而云解析DNS会…...

Linux命令之awk

awk是一个有强大的文本格式化能力的linux命令&#xff0c;早期是在Unix上实现的&#xff0c;linux后来也可以使用了&#xff0c;我们在Linux上使用的awk是gawk&#xff08;GNU awk的意思&#xff09; 语法 awk [option] 模式{动作} file option表示awk的可选参数&#xff0c;可…...

实战-缓存数据一致+binlog初始+cannel监听+数据迁移,数据一致性架构设计

前言 一. 解决缓存不命中&#xff08;高并发操作击穿打挂DB的风险&#xff09; 当并发量打的时候&#xff0c;当我们的缓存过期时&#xff0c;就算到数据库的比例偏小的时候&#xff0c;我们的请求时比较大的。那也会存在数据库崩掉的情况。解决方案想法如下&#xff08;总体…...

nginx配置中proxy_pass反向代理502的bug

记录一个坑人的bug&#xff0c; 我今天在一台新的liunx上运行nginx来进行反向代理时候&#xff0c;发现怎么测都是502 我把配置全部删了从头开始配置&#xff0c;发现80端口正常&#xff0c;80端口index.html正常&#xff0c;反向代理转向http://127.0.0.1/也正常&#xff0c;…...

JavaScript 两种方案打开文件对话框

JavaScript 两种方案打开文件对话框 文章目录JavaScript 两种方案打开文件对话框一、文件对话框二、传统方案表单元素&#x1f308;三、文件系统访问API&#x1f4a6;四、更进一步使用六、代码仓库&#x1f310;七、参考资料&#x1f498;七、推荐博文&#x1f357;一、文件对话…...

[Python3高阶编程] - [Python3高阶编程] - 异步编程深度学习指南三:手动实现AsyncRLock

一、手动实现 AsyncRLockimport asyncio from typing import Optionalclass AsyncRLock:def __init__(self):self._lock asyncio.Lock() # 底层互斥锁self._owner: Optional[asyncio.Task] None # 当前持有锁的协程&#xff08;Task&#xff09;self._count 0 …...

DOL-CHS-MODS整合包零基础精通指南:从安装到定制全方位教程

DOL-CHS-MODS整合包零基础精通指南&#xff1a;从安装到定制全方位教程 【免费下载链接】DOL-CHS-MODS Degrees of Lewdity 整合 项目地址: https://gitcode.com/gh_mirrors/do/DOL-CHS-MODS 项目价值定位 DOL-CHS-MODS作为Degrees of Lewdity的中文整合方案&#xff0…...

量化交易backtrader实践(二)_数据预处理篇(1)_格式转换与清洗

1. 数据预处理的重要性 在量化交易中&#xff0c;数据预处理就像做菜前的食材准备阶段。想象一下&#xff0c;如果你要做一道红烧肉&#xff0c;却直接拿刚从冰箱取出的冻肉下锅&#xff0c;结果可想而知。同样地&#xff0c;未经处理的原始金融数据直接喂给backtrader&#xf…...

基于离散化方法的三维土豆运动微波加热案例:参数化扫描与继承解算子实现离散化

基于离散化方法三维土豆运动微波加热的案例——第一种方法参数化扫描和继承解的算子实现离散化 离散化方式是最常见的实现运动仿真的方法之一&#xff0c;实现离散化的方法有很多&#xff0c;对于COMSOL主要的离散化及种 目前我研究了三种实现离散化的方法&#xff0c;这三种方…...

Kandinsky-5.0-I2V-Lite-5s代码实例:Python调用API与前端交互实操解析

Kandinsky-5.0-I2V-Lite-5s代码实例&#xff1a;Python调用API与前端交互实操解析 1. 模型简介与核心能力 Kandinsky-5.0-I2V-Lite-5s是一款轻量级图生视频模型&#xff0c;它能够将静态图片转化为动态视频内容。只需提供一张首帧图片和简单的运动描述&#xff0c;模型就能生…...

【数字电路】从双稳态到触发器:时序逻辑的存储基石

1. 数字世界的记忆细胞&#xff1a;双稳态电路探秘 当你按下电脑电源键的瞬间&#xff0c;数十亿个微型存储单元开始工作&#xff0c;它们就像数字世界的记忆细胞&#xff0c;忠实地记录着每一个比特的信息。这一切的起点&#xff0c;正是我们今天要探讨的双稳态电路。想象一下…...

Conda环境回滚实战:当安装新包搞崩base环境时如何一键恢复

Conda环境回滚实战&#xff1a;当安装新包搞崩base环境时如何一键恢复 在Python开发中&#xff0c;conda作为包管理和环境管理的利器&#xff0c;几乎成为数据科学家的标配工具。但越是频繁使用conda&#xff0c;越容易遇到一个令人头疼的问题——在base环境中安装新包后&#…...

代码重构的艺术:在业务狂奔中如何优雅地还技术债

业务压力下的质量困局在快节奏的软件开发世界中&#xff0c;业务需求如同永不停歇的浪潮&#xff0c;推动着团队高速前行。为了抢占市场先机、快速响应变化&#xff0c;“先上线&#xff0c;再优化”几乎成了许多项目的默认模式。然而&#xff0c;这种模式背后&#xff0c;是以…...

CSS 容器查询:组件级响应式设计

CSS 容器查询&#xff1a;组件级响应式设计代码如诗&#xff0c;容器如画。让我们用容器查询的强大能力&#xff0c;创建真正自适应的组件。什么是容器查询&#xff1f; 容器查询&#xff08;Container Queries&#xff09;是 CSS 中一项革命性的特性&#xff0c;它允许我们根据…...

3步实现AI智能背景移除:开源工具让透明GIF制作变得如此简单

3步实现AI智能背景移除&#xff1a;开源工具让透明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. 项目地址:…...