C语言-strstr(字符串里查找字符串)

news2025/1/10 3:28:27

strstr(字符串里查找字符串)

语法格式

库函数实现的逻辑 

1,返回一个指向str2在str1中第一次出现的位置,如果str2不是p,则返回一个空指针,函数返回字符串str2在字符串str1中第一次出现的位置)

2,匹配过程不包括终止的空字符,但它将停止

举例

这里是arr1里面有没有出现p这个字符

这里是找到了

举例2

没有找到

返回类型是char*

接收数值来一个

在(1,3)

1里面寻找有没有3

模拟strstrhanhsu

这里是不希望被修改的 所以加上const 这样就不能修改了

这里我们分析查找的时候的多种情况

第一种情况的实现

第二种情况的实现

这里需要总有一个指针指向初始的位置

一个指针记录到哪里

还有一个指针记住从哪开始匹配

这里进行比较 不相等 cur向后走一步

也就是开始尝试匹配 这个需要一个指针进行记录 这里的记录指针是不动的

这里是对比的函数里面是不遇见0 的

但是这里需要知道的是 *s2 等于\0的时候 也就找完了(找得到)

最后找不到 也就是遍历结束的时候 跳出循环 所以 此时也就返回空指针

但是这还需要知道 如果arrr2是空字符串(进行特殊场景处理)但是需要强制类型转化 (因为是空指针)

在循环条件里面已经限制arr1比arr2小了

上述的模拟是暴力查找 也就是不讲究效率的问题

这里说明一下 这里虽然初始化为空指针 但是没有对他使用 所以就相当于一条野狗先拴住 不靠近 用的时候再进行赋值

kmp算法(解决的也是字符串里面寻找字符串)(实现和理解更复杂)(有兴趣研究一下)

strstr函数模拟的实现

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<string.h>
//strstr函数的模拟
char* my_strstr(const char* arr1, const char* arr2)
{
	assert(arr1 && arr2);//这里防止是传参过来的是空指针 进行一个断言
	const char* s1 = NULL;
	const char* s2 = NULL;
	//这里需要创建两个指针变量 一个负责指向开始的位置 一个负责移动如果不满足条件的情况下 需要返回新的循环继续开始循环 直到遇见 或者循环结束
	
	if (*arr2 == '\0')//这里首先判断是不是直接传过来空的字符 是的话 直接返回
		return (char*)arr1;//这里是进行一个强制类型转化 因为 const是
	//对于const存在的变量,通常不需要进行显式的类型转换,因为它的值是固定的。
	// 然而,如果你需要将const变量用于不同的类型或者接口,你可能需要进行类型转换。
	// 这通常涉及到将const变量指向的内存地址转换为其他类型指针,或者将它的值转换为其他格式或类型。
	
	while (*arr1)//这里首先是指向数组 也就是只要数组循环不结束 也就一直寻找 下面会进行数组首元素的++ 这里解应用是因为补解应用就是地址 我们是寻找元素的
	{
		s1 = arr1;//这里进行赋值  把之前的空指针进行等于两个指针变量,也就是此时也就可以满足一个进行移动 一个进行计数 到那个位置了
		s2 = arr2;//这里进行赋值  把之前的空指针进行等于两个指针变量,
		while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)//这里的循环条件是 只要每次对比的一样 并且不遇见最后一个字符'\0'就继续循环
		{
			s1++;//这里如果 s2 是三个字符 也就是循环三次 三次结束没有找到 s2也就是也就不等于s1了 此时也就跳出循环了
			s2++;//然后 此时*arr1原本指向的字符如果是首元素 s1循环结束之后指向的是首元素+3个字符 这个时候没有满足条件 然后s1这个时候也就没有什么作用了 重新赋值所以arr++ 也就变成第二个元素 重新进行计算
		}
		if (*s2 == '\0')//这里是当对比字符串循环结束的时候 说明找到了元素 也就可以进行返回数值了
		{
			return (char*)arr1;//这里是找到这个元素所在位置 然后进行强制转化 把数值传递过去 传递的是开始找到的元素的位置 然后打印
		}
		arr1++;//这里是训话每次结束之后 进行++ 也就是元素向后移动一位 集训进行对比
	}
	return NULL;//如果最后循环结束 还没找到 此时也就返回空指针


}
//strstr函数的使用和模拟
int main()
{
	char arr[] = "a b bbc def\n";
	const char *p1 = "bbc";
	char* ret = strstr(arr, p1);//这里是一个strstr函数的使用
	if (p1==NULL)
		printf("没找到。\n");
	else
		printf("找到了:%s\n", ret);


	char arr1[] = "abbbcdef\n";
	const char* p2 = "bbc";
	char* re = my_strstr(arr1, p2);
	if (p2 == NULL)
		printf("没找到。");
	else
		printf("找到了:%s\n", re);

	printf("找到了:%s\n", arr1);



	return 0;
}

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

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

相关文章

SpringBoot3项目框架搭建

注意jdk版本必须17以上才能运行 1、创建Maven工程 2、导入spring-boot-stater-web起步依赖 3、编写Controller 4、提供启动类 5、访问http://localhost:8080/hello

计算机丢失vcruntime140.dll解决办法分享,有效解决vcruntime140.dll丢失问题

vcruntime140.dll是一个属于 Visual C Redistributable for Visual Studio 2015 的动态链接库文件。这个文件是运行那些用 Visual Studio 2015 或相关版本开发的 C 应用程序必不可少的一部分。如果系统中缺少此文件&#xff0c;或文件损坏&#xff0c;则可能会在尝试启动相关软…

[【Hello,PyQt】pyqt5中的QLineEdit控件

PyQt5 是一个强大的Python库&#xff0c;用于创建图形用户界面&#xff08;GUI&#xff09;。其中&#xff0c;QLineEdit 控件作为一个简单而实用的组件&#xff0c;经常用于接受用户的单行文本输入&#xff0c;甚至可以用来进行输入格式的限制。这篇博客中将介绍 QLineEdit 控…

react-native使用FireBase实现google登陆

一、前置操作 首先下载这个包 yarn add react-native-google-signin/google-signin 二、Google cloud配置 Google Cloud 去google控制台新建一个android项目&#xff0c;这时候需要用到你自己创建的keystore的sha1值&#xff0c;然后会让你下载一个JSON文件&#xff0c;先保…

【电路笔记】-金属氧化物半导体晶体管(MOSFET)

金属氧化物半导体晶体管(MOSFET) 文章目录 金属氧化物半导体晶体管(MOSFET)1、概述2、MOSFET 基本结构和符号2.1 耗尽型 MOSFET2.2 增强型MOSFET3、MOSFET放大器4、总结1、概述 除了结型场效应晶体管 (JFET) 之外,还有另一种类型的场效应晶体管,其栅极输入与主载流通道电绝缘…

计算机网络—VLAN 配置

目录 1.拓扑图 2.实验环境准备 2.关闭不相关接口&#xff0c;并配置 Trunk 3.创建 VLAN 4.为客户端配置 IP地址 5.检测设备连通性&#xff0c;验证 VLAN 配置结果 6.配置 Hybrid 端口 7.配置文件 1.拓扑图 2.实验环境准备 在S1和S2上创建Eth-Trunk 1并配置该Eth-Trunk…

JVM-5

1.选择垃圾收集器 如果你的堆大小不是很大&#xff08;比如 100MB &#xff09;&#xff0c;选择串行收集器一般是效率最高的。 参数&#xff1a; -XX:UseSerialGC 。如果你的应用运行在单核的机器上&#xff0c;或者你的虚拟机核数只有单核&#xff0c;选择串行收集器依然是合…

17-指针(初识)

17-1 内存 内存是电脑上特别重要的存储器&#xff0c;计算机中程序的运行都是在内存中进行的。 为了有效的使用内存&#xff0c;就把内存划分成一个个小的内存单元&#xff0c;每个内存单元的大小是1个字节。为了能够有效的访问到内存的每个单元&#xff0c;就给内存单元进行…

GraspNet-baseline复现----Linux-Ubuntu

1.基本环境 Ubuntu 20.04Cuda 11.0 、cuDNN 80.0Python 3.7.16PyTorch 1.7.0 2.环境配置 PyTorch的版本对Cuda和Python的版本都有依赖&#xff0c;所以基本步骤是 确定需要安装的PyTorch版本 —> 通过 网站 确定对应的cuda版本和python版本 —> 创建虚拟环境配置环境。…

16.WEB渗透测试--Kali Linux(四)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;15.WEB渗透测试--Kali Linux&#xff08;三&#xff09;-CSDN博客 1.crunch简介与使用 C…

【回归预测】基于SSA-RF(麻雀搜索算法优化随机森林)的回归预测 多输入单输出【Matlab代码#66】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】1. 随机森林RF算法2. 麻雀搜索算法3. 实验模型4. 部分代码展示5. 仿真结果展示6. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】 1. 随机森林RF算法 …

二进一出模拟量隔离变送器

二进一出模拟量隔离变送器定义&#xff1a; 是两路模拟量信号同时输入&#xff0c;隔离变送器选择其中的一路高信号输入的或者低信号输入的通道进行信号传输及控制&#xff0c;该隔离变送器可以用控制信号来选择A路&#xff0c;B路的输入信号&#xff0c;还可以通过干接点&…

开源堡垒机Jumpserver安装教程

前言:堡垒机的应用场景 公司内有若干台服务器,既有windows的也有linux的, 提供有ERP,OA,Web,报表等等各种服务,往往需要远程登录到服务器上去做运维,但如果给root或者administrator权限,很容易出现不知道谁操作了的问题.如果不同人设置不同账号,又账号过多,权限不足等等其他问题…

5 个适用于 Windows 10 和 11 的最佳 PDF 转 Word 转换器

PDF 文件是共享文档的首选格式&#xff0c;但是此类文件存在一些限制&#xff0c;导致难以修改或编辑。因此&#xff0c;您可能会发现自己正在寻找一种将 PDF 文件转换为 Word 或其他可编辑格式的方法。 有许多不同的 PDF 转换器&#xff0c;每种转换器提供的功能略有不同。本…

移远通信亮相AWE 2024,以科技力量推动智能家居产业加速发展

科技的飞速发展&#xff0c;为我们的生活带来了诸多便利&#xff0c;从传统的家电产品到智能化的家居设备&#xff0c;我们的居家生活正朝着更智能、更便捷的方向变革。 3月14日&#xff0c;中国家电及消费电子博览会&#xff08;Appliance&electronics World Expo&#xf…

恒创科技:什么是BGP线路服务器?BGP机房的优点是什么?

在当今的互联网架构中&#xff0c;BGP(边界网关协议)线路服务器和BGP机房扮演着至关重要的角色。BGP作为一种用于在自治系统(AS)之间交换路由信息的路径向量协议&#xff0c;它确保了互联网上的数据能够高效、准确地从一个地方传输到另一个地方。那么&#xff0c;究竟什么是BGP…

【Web】记录CISCN2023国赛初赛DeserBug题目复现

目录 前言 分析 step0 step1 step2 EXP 总结 前言 Hessian的链子审得有点疲劳&#xff0c;不如做做题吧&#xff0c;挑了国赛入手&#xff0c;整体做下来感觉十分丝滑&水到渠成&#xff0c;自然&通透。 仅仅是记录一下菜鸡做题的感受&#xff0c;不会往深入了…

闪电网络协议设计思想剖析

1. 引言 闪电网络可能是比特币之上部署的最受期待的技术创新。闪电网络&#xff0c;为由 Joseph Poon 和 Tadge Dryja 于2015年首次提出的支付层&#xff0c;承诺支持&#xff1a; 用户之间几乎无限数量的链下交易&#xff0c;几乎免费&#xff0c;同时利用比特币提供的安全性…

【CKA模拟题】查询消耗CPU最多的Pod

题干 For this question, please set this context (In exam, diff cluster name) 对于此问题&#xff0c;请设置此上下文&#xff08;在考试中&#xff0c;diff 集群名称&#xff09; kubectl config use-context kubernetes-adminkubernetesFind the pod that consumes the …

Centos7安装ffmpeg

Centos7安装ffmpeg 用到的包压缩并安装 用到的包 压缩并安装 tar xvJf ffmpeg-5.0.1.tar.xz yum install -y gcctar -zxvf yasm-1.3.0.tar.gz cd yasm-1.3.0 ./configure make && make install yasm --versionyum install -y bzip2tar jxvf nasm-2.14.02.tar.bz2 cd n…