strstr 的使用和模拟实现

就位了吗?如果坐好了的话,那么我就要开始这一期的表演了哦!

strstr 的使用和模拟实现:

char * strstr ( const char * str1, const char * str2);
Returns a pointer to the first occurrence of str2 in str1, or a null pointer if str2 is not part of str1. (函数返回字符串str2在字符串str1中第⼀次出现的位置)。
The matching process does not include the terminating null-characters, but it stops there.(字符 串的⽐较匹配不包含 \0 字符,以 \0 作为结束标志)。

strstr 的使用:

这些函数的使用呢都是非常简单的,我们只需要加上相应的头文件就可以了。

函数返回字符串str2在字符串str1中第⼀次出现的位置 !

strstr 的模拟实现:

那么对于strstr函数的模拟实现,我们应该怎么做呢?我们一起来画图分析分析:

 我们用i和j指向的位置进行比较:

首先我们的a和b不相等,那么我们的i需要向后移一位,指向了我们的b,我们的j没有动。

现在b和b相等,那么此时我们的i和j都需要向后移一位进行比较,还是相等的,继续向后移动一位,此时我们的主串为c,子串为我们的d,两者不相等。那么我们此时我们的主串的i是不是应该返回到我们下标为2的位置进行重新下一步比较呢。我们的子串则返回到下标为0的位置重新比较!j可以很好的返回到我们的0的位置,那么我们的i又该怎样计算呢?在最开始的时候我们的首元素不相等,我们的主串的i向后移动了一步,然后相等后一起向后加加,所以我们可以很好的推导出:i = i-j+1!

此时主串的i移动到下表为2的位置时与子串的不相等,此时我们的就需要向后移动位置了,i= 2-0+1 = 3;还是不相等,继续向后移动一位。此时主串i的位置与我们子串的元素相等,那么此时i和j一起向后移动一位,还是相等的我们接着移动一位,还是相等的!那么我们就继续向后移动一位,此时我们的子串的元素与我们主串的元素不相等,但是此时我们子串所指向的元素为\0,说明此时我们已经历遍完我们子串了,那么说明在主串中找到了子串,那么此时我们的i就应该返回到我们下标为4的位置!此时如果我们再以i = i-j+1进行计算的话,就是我们下标为5的位置,是错误的。所以此时我们应该写成i= i-j,因为它们俩是一起移动的。所以我们的大体思路都知道了,下面我们一起来看看代码的实现:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <assert.h>int BFalg(const char* str1,const char* str2)
{assert(str1 && str2);//先进行断言一下if (str1 == NULL || str2 == NULL){return -1;//如果为空指针,找不到我们就返回-1}size_t len1 = strlen(str1);size_t len2 = strlen(str2);int i = 0;int j = 0;while (i < len1 && j < len2){if (str1[i] == str2[j]){i++;j++;}else//不相等时{i = i - j + 1;j = 0;}}if (j >= len2)//历遍完时{return i - j;}return -1;
}
int main()
{printf("%d\n", BFalg("abcdabf", "da"));printf("%d\n", BFalg("abcdabf", "ba"));printf("%d\n", BFalg("abcdabf", "bc"));return 0;
}

我们来看看我们的结果是否正确: 

那么也是正确的!有了上面的推演,我们下面来看看另一种写法,方法都是一样的:我们如果不知道如何推导i退回位置的话,我们就可以拿一个变量(sr)来存储i最初出去的位置,当我们的i指向的位置不相等时 ,我们的sr就向后移动一位,然后我们的i就移动到我们sr的位置,此时我们就很好的解决了i回退的位置了!

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <assert.h>char* BFalg(const char* str1, const char* str2)
{const char* sr = str1;const char* s1 = NULL;const char* s2 = NULL;assert(str1 && str2);if (*str2 == '\0'){return (char*)str1;}while (*sr){s1 = sr;s2 = str2;while (*s1 && *s2 && *s1 == *s2){s1++;s2++;}if (*s2 == '\0'){return (char*)sr;}sr++;}return NULL;
}int main()
{char arr1[] = "abcdacdf";char arr2[] = "cd";char* ret = BFalg(arr1, arr2);if (ret != NULL)printf("%s\n", ret);elseprintf("找不到\n");return 0;
}

该方法呢就比较暴力了,需要我们一个一个的跳回去比较,当然还有另外的一种KMP算法,但是呢我还没有研究透,就不能向大家展示了,小伙伴们如果感兴趣的话,可以去查看资料哦!

好了,今天就到此结束了,我们下一期再见!创作不易,麻烦给一个免费的小爱心哦,♥️♥️♥️ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/234677.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

优维全新低碳产品亮相SBE23 Asia-Pacific绿色建筑促进碳中和论坛

2023年11月23日—24日&#xff0c;由深圳市人民政府主办&#xff0c;深圳市住房和建设局、深圳市发展与改革委员会、深圳市龙岗区人民政府承办&#xff0c;深圳市绿色建筑协会作为执行单位的“2023年可持续建筑环境亚太地区会议&#xff08;SBE23 Asia-Pacific&#xff09;”在…

图解系列--HTTPS,认证

确保 Web 安全的HTTPS 1.HTTP 的缺点 1.1.通信使用明文可能会被窃听 加密处理防止被窃听 加密的对象可以有这么几个。 (1).通信的加密 HTTP 协议中没有加密机制&#xff0c;但可以通过和 SSL&#xff08;Secure Socket Layer&#xff0c;安全套接层&#xff09;或TLS&#xff…

【人工智能Ⅰ】实验3:蚁群算法

实验3 蚁群算法的应用 一、实验内容 TSP 问题的蚁群算法实现。 二、实验目的 1. 熟悉和掌握蚁群算法的基本概念和思想&#xff1b; 2. 理解和掌握蚁群算法的参数选取&#xff0c;解决实际应用问题。 三、实验原理 1&#xff0e;算法来源 蚁群算法的基本原理来源于自然界…

lightdb-ignore_row_on_dupkey_index

LightDB 支持 ignore_row_on_dupkey_index hint LightDB 从23.4 开始支持oracle的 ignore_row_on_dupkey_index hint&#xff0c; 这个hint是用来忽略唯一键冲突的。类似与mysql的 insert ignore。 语法如下&#xff1a; 在LightDB中ignore_row_on_dupkey_index的效果等同于o…

Java中的Integer.bitCount浅析

文章目录 Java中的Integer.bitCount浅析问题思考Integer.bitCount解释拓展 Java中的Integer.bitCount浅析 原文链接 问题 有一个整数x,我们需要统计该整数的二进制表示中包含的1的个数。这个也被称为汉明重量&#xff08;Hamming weight&#xff09;。 例如&#xff0c;整数…

最简单的链路追踪收集器

链路追踪可帮助您快速了解程序服务之间的调用关系&#xff0c;并快速洞悉内部发生的情况。主流的链路追踪系统有zipkin,jaeger,skywalking等&#xff0c;由于opentelemetry的存在&#xff0c;都具有opentelemetry的转换器。 我们利用opentelemetry来进行zipkin,jaeger,skywalk…

Python list列表添加元素的3种方法及删除元素的3种方法

Python list列表添加元素的3种方法 Python list 列表增加元素可调用列表的 append() 方法&#xff0c;该方法会把传入的参数追加到列表的最后面。 append() 方法既可接收单个值&#xff0c;也可接收元组、列表等&#xff0c;但该方法只是把元组、列表当成单个元素&#xff0c;这…

Jmeter接口测试:jmeter_HTTP Cookie管理器看这一篇文章就够了

HTTP Cookie管理器 HTTP Cookie管理器可以像浏览器一样自动存储和发送cookie&#xff0c;以这种自 动收集的方式收集到的cookie不会在cookie manager中进行展示&#xff0c;但是运行后&#xff0c; 可以通过 查看结果树&#xff08;监听器&#xff09;可以查看到cookie信息 除…

西南科技大学数字电子技术实验一(数字信号基本参数与逻辑门电路功能测试及FPGA 实现)FPGA部分

一、 实验目的 1、掌握基于 Verilog 语言的 diamond 工具设计全流程。 2、熟悉、应用 Verilog HDL 描述数字电路。 3、掌握 Verilog HDL 的组合和时序逻辑电路的设计方法。 4、掌握“小脚丫”开发板的使用方法。 二、 实验原理 与门逻辑表达式:Y=AB 原理仿真图: 2 输入…

docker-compose;私有镜像仓库harbor搭建;镜像推送到私有仓库harbor

docker-compose&#xff1b;私有镜像仓库harbor搭建&#xff1b;镜像推送到私有仓库harbor 文章目录 docker-compose&#xff1b;私有镜像仓库harbor搭建&#xff1b;镜像推送到私有仓库harbordocker-compose私有镜像仓库harbor搭建镜像推送到私有仓库harbor docker-compose D…

LLM 分布式训练框架 | DeepSpeed与Accelerate

&#x1f680; 简单记录下根据网上资料&#xff08;如Reference中所列&#xff09;所学到的一些知识&#xff0c;这里主要介绍的是deepspeed分布式训练框架相关概念。 &#x1f604;小日记&#xff1a;今天太舒服了&#xff0c;早上跑了6km&#xff0c;晚上吃了养生菌菇火锅~ …

Ubuntu+Tesla V100环境配置

系统基本信息 nvidia-smi’ nvidia-smi 470.182.03 driver version:470.182.03 cuda version: 11.4 查看系统体系结构 uname -aUTC 2023 x86_64 x86_64 x86_64 GNU/Linux 下载miniconda https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/?CM&OA https://mi…