【strstr函数的介绍和模拟实现——超详细版】

news2024/11/24 20:01:35

strstr函数的介绍和模拟实现

strstr函数的介绍

资源来源于cplusplus网站
在这里插入图片描述

strstr函数声明:
char *strstr( const char *str1, const char *str2 );

它的作用其实就是:
在字符串str1中查找是否含有字符串str2,如果存在,返回str2在str1中第一次出现的地址;否则返回NULL

不难看出它是定位字符串的

strstr函数是在字符串str1中查找是否含有字符串str2,如果存在,返回str2在str1中第一次出现的地址;否则返回NULL。

1.1用法举例

#include<stdio.h>
#include<string.h>
 
//strstr函数的应用
int main()
{
	char arr1[] = "abbbcdef";
	char arr2[] = "bbc";
 
	printf("%s\n", strstr(arr1, arr2));
 
	return 0;
}

1.2结果展示

在这里插入图片描述

2.strstr函数的模拟实现

2.1模拟分析

对strstr函数有了一定了解后,我们开始对strstr函数的模拟—my_strstr函数。
如下图所示,假设有两个字符串,指针str1, str2分别指向字符串首字母。
要在str1中查找str2并打印出来,先判断str1和str2指向的字符是否相等,此时有两种情况:第一种情况指向的字符不相等,str1要指向下一个字符,再判断,如此循环往复,当str1指向的是 ‘\0’ 时,可以判断出str1中不存在str2,此时返回NULL;
第二种情况下指向的字符相等,那么不仅str1要向后读取字符,str2也要向后读取字符,再判断是否相等。
在向后读取字符的过程中,仍有两种情况:1.str1和str2指向的字符一直相等,直到str2指向’\0’,这时可以知道str1中存在str2字符串,返回的是str1中的str2字串的第一个字符地址;
2.str1和str2指向的字符不全相等,例如下图中,*(str1+1) == str2,(str1+2) == (str2+1),(str1+3) != *(str2+2),此时指针str2就要返回到字符串str2首字符的地址,而指针str1需要返回到第一次和str2指向的字符相等的后一个位置,即字符串str1中第二个 ‘b’ 的地址。然后又回到一开始的判断。

(注:字符串名字也是字符串首字符地址。)

在这里插入图片描述

使用strstr时,最终返回str1中第三个字符的地址,打印的是该地址后的字符串

2.2代码实现

const char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 && str2);

	const char* s1 = str1;
	const char* cp = str1;
	const char* s2 = str2;
	//如果子字符串是空的直接返回str1的地址
	if (*str2 == '\0')
		return str1;

	while (*cp)
	{
		s1 = cp;
		s2 = str2;

		while (*s1 && *s2 && (*s1 == *s2))
		{
			s1++;
			s2++;
		}
			if (*s2 == '\0')
				return cp;

			cp++;

	}
	return NULL;

}
int main()
{
    char arr1[] = "abbbcdef";
	char arr2[] = "bbc";
	const char* ret = my_strstr(arr1, arr2);
	if (ret != NULL)
	{
		printf("%s\n",ret);
	}
	else
		printf("找不到\n");


	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据安全服务是什么意思?

数据安全服务是指为保护用户的数据免受未经授权的访问、修改、损坏或泄露的服务。随着信息化的发展&#xff0c;大量的个人和企业数据被存储在网络上&#xff0c;数据安全问题也日益受到关注。数据安全服务旨在帮助用户识别和应对各种潜在的数据安全风险&#xff0c;并提供相应…

支付宝沙箱调用错误

支付宝沙箱调用参数就三个APPID&#xff0c;用户私钥&#xff0c;支付宝公钥&#xff0c; 发送请求需要的配置 alipay: app_id: 2021000122636644 merchant_private_key: 用户私钥 alipay_public_key: 支付宝公钥 sign_type: RSA2 charset: utf-8 gatewayUrl: https://openap…

企业架构LNMP学习笔记30

1、upstream 中server的关键字&#xff1a;语法&#xff1a; upstream中的分发之后的几个关键字&#xff1a; 1&#xff09;backup 备 其他的没有backup标识的都不可用了&#xff0c;才分发到backup&#xff1b; 2&#xff09;down 此条配置&#xff0c;不会被分发到。 syst…

Android Studio实现一笔画完小游戏

文章目录 一、项目概述二、开发环境三、详细设计3.1、数据库设计3.2、普通模式3.3、随机模式3.4、关卡列表 四、运行演示五、项目总结六、源码获取 一、项目概述 Android一笔画完是一种益智游戏&#xff0c;玩家需要从起点开始通过一条连续的线&#xff0c;将图形中所有的方块…

谷歌浏览器书签位置及怎么导入书签

谷歌浏览器书签位置&#xff1f; 在谷歌浏览器地址栏输入chrome://version/ 按回车键打开谷歌浏览器安装信息在显示的个人资料路径查找到Bookmarks文件&#xff0c;及为谷歌浏览器书签文件 谷歌浏览器怎么导入书签&#xff1f; 将Bookmarks加入.html后缀在书签管理器中找到右…

可观测性在灰度发布中的应用

前言 随着云计算的发展、云原生时代的来临&#xff0c;企业数字化转型进程不断深入&#xff0c;应用开发也越来越多地基于微服务化模式&#xff0c;快速迭代的能力使得应用开发更高效、更灵活。同时&#xff0c;也不得不面临应用版本快速升级所带来的的巨大挑战。 传统的发布方…

【数据结构与算法系列3】有序数组的平方 (C++ Python)

给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 示例 1&#xff1a; 输入&#xff1a;nums [-4,-1,0,3,10] 输出&#xff1a;[0,1,9,16,100] 解释&#xff1a;平方后&#xff0c;数组变为 …

Spring框架的未来:Spring 6的新特性预览

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Matlab图像处理-自适应阈值

自适应阈值 在许多的情况下&#xff0c;背景的灰度值并不是常数&#xff0c;物体和背景的对比度在图像中也有变化。这时&#xff0c;一个在图像中某一区域效果良好的阈值在其它区域却可能效果很差。在这种情况下&#xff0c;把灰度阈值取成一个随图像中位置缓慢变化的函数值是…

深度优先搜索遍历与广度优先搜索遍历

目录 一.深度优先搜索遍历 1.深度优先遍历的方法 2.采用邻接矩阵表示图的深度优先搜索遍历 3.非连通图的遍历 二.广度优先搜索遍历 1.广度优先搜索遍历的方法 2.非连通图的广度遍历 3.广度优先搜索遍历的实现 4.按广度优先非递归遍历连通图 一.深度优先搜索遍历 1.深…

D. Matrix Cascade

Problem - D - Codeforces 思路&#xff1a;这个题就是要维护每个位置被修改了几次&#xff0c;但是一直没想到一个好的方法&#xff0c;一直在关注这个点对下面的点产生的影响&#xff0c;但是其实我们可以维护这个点能够由那几个点影响&#xff0c;其实就是一个以x,y为下顶点…

如何把glb格式模型gltf格式模型导入3dmax和C4D,U3D,UE4这些主流软件中

咱有时候去glbxz.com添加链接描述 官网下载免费glb格式模型&#xff0c;gltf模型下载时候是没有通用格式&#xff0c;例如fbx&#xff0c;obj&#xff0c;这个时候3dmax和C4D直接打开导入是不行的&#xff0c;也可以制作glb模型&#xff0c;扣扣&#xff1a;424081801 这个时候…

扫地僧万能HTML模板站群【搜狗站群单站模式内页收录】配置教程

浅测【搜狗内页收录较好】可自行进行测试对比 [测试的域名有搜狗蜘蛛&#xff0c;但是不收录] [一换程序嘎嘎乱叫] [测试的为内页收录&#xff0c;非泛站] [泛站容易被端&#xff0c;搜狗不建议泛站] 第一步配置SEO设置如图&#xff1a; 站群模式&#xff1a;单站 泛站…

网络延迟简介:为什么它重要,如何测量

1、什么是延迟呢? 延迟其实就是我们在网页浏览或者使用应用时,从我们点击请求到服务器返回结果给我们之间的时间差。就像你在跟朋友打电话,你说完话后,朋友听到并回应你所说话的时间差一样。 我们的最终目标是创建一个系统,让这个时间差变得尽可能短,也就是实现零延迟。…

使用Mybatis实现基本的增删改查------数据输出

需要和批量注入一起使用 当sql返回的实体类在java中没有的时候,可以使用map接值 开启自动事务提交openSession(true),事务在最后会进行自动提交 //3.获取Sqlsession对象[自动开启JDBC]//会自动开启事务,不会自动提交事务.但是提交事务需要sqlsession.commit()方法//openSession…

【C++】day2学习成果:引用、结构体等等。。。

1.封装一个结构体&#xff0c;结构体中包含一个私有数组&#xff0c;用来存放学生的成绩&#xff0c;包含一个私有变量&#xff0c;用来记录学生个数&#xff0c; 提供一个公有成员函数&#xff0c;void setNum(int num)用于设置学生个数 提供一个公有成员函数&#xff1a;void…

Python进阶语法之推导式

目录 目录 前言 思维导图 1.普通写法 1.1代码解读 1.2,结果展示 2.列表推导式 2.1,重要 2.2,列表推导式初步写法 2.2.1,代码解读 2.2.2,结果展示 2.3,列表表达式之条件判断式 2.3.1,代码解读 2.3.2,结果展示 2.4,进行两层for循环 2.4.1,代码解读 2.4.2,结…

【PowerQuery】Excel 的自动刷新功能-最低一分钟刷新

在Excel集成了PowerQuery之后,它提供了数据的手动刷新功能之外,也提供了数据的自动刷新功能。需要注意的是,PowerQuery提供的自动刷新功能是针对连接的,也就是说在PowerQuery自动刷新功能不是全局刷新功能,而是针对连接本身提供。接下来我们来看一下如何实现PowerQuery连接…

Python绘图——生存曲线

今天我们将一起学习如何利用Python中____lifelines包_____建模和分析生存数据并用plot_绘制生存曲线&#xff0c;以及更改其样式如标题字号大小&#xff0c;坐标轴及图例设置等&#xff0c;使用Python即可绘制出SCI论文图&#xff01;___” lifelines包 lifelines 是一个 Pyt…

猫头虎的技术笔记:Spring Boot启动报错解决方案

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…