当前位置: 首页 > 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! 

 

http://www.lryc.cn/news/18776.html

相关文章:

  • 【ArcGIS Pro二次开发】(7):地图(Map)的基本操作
  • python 自动化测试 pytest 的使用
  • 闭包(回顾)
  • 利用好这两个方法,服务型企业缺成本票不再难解决!
  • 前端面试编程题(异步调度,Promise实现、占用空间大小、渲染虚拟节点、实现for of)
  • 复旦团队发布国内首个模型MOSS 类ChatGPT
  • 5.35 综合案例2.0 -称重数据上传云端
  • 如何让人机对话更自然?
  • Python每日一练(20230224)
  • 【Linux】-- Shell的运行原理、Linux当中的权限
  • MOS管选型参数:VGS(th)
  • 二.线性表之顺序表
  • ElasticSearch - SpringBoot整合ElasticSearch实现文档的增删改
  • JavaScript 库
  • 云解析DNS为什么要配置默认线路?
  • Linux命令之awk
  • 实战-缓存数据一致+binlog初始+cannel监听+数据迁移,数据一致性架构设计
  • nginx配置中proxy_pass反向代理502的bug
  • JavaScript 两种方案打开文件对话框
  • Pycharm远程服务器常见问题
  • 内容团队如何快速出稿
  • es-08索引的批量操作
  • 诈金花的概率
  • ESP32设备驱动-MLX90393磁场传感器驱动
  • Java面试题-Spring框架
  • 【计算机物理模拟】-力矩、转动惯量和角速度之间的关系
  • async和await用法理解和快速上手 , 同步任务和异步任务顺序安排和轻松理解 , js代码执行顺序表面知道
  • Linux下java服务占用cpu过高如何处理
  • ros下用kinectv2运行orbslam2
  • MVP简单模型搭建【架构】