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

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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

bootstrap3 -入门简学

1.前期准备工作 1.1 https://www.bootcss.com/ 1.2 点击下载 1.3解压下载好得东西 2. 版本介绍 Bootstrap 版本 目前市面上使用的最多的是 3.x.x 版本。各个版本的介绍&#xff1a; 2.3.2版本&#xff1a; 2013年之后&#xff0c;停止维护&#xff1b; 支持更广泛的浏览…

CIDR网络地址、广播地址、网段区间计算说明与计算工具

文章目录 开始问题参考答案 答案解析计算工具测试 开始 好久没有看计算网络&#xff0c;感觉已经完全返给老师了。 最近&#xff0c;有同事遇到个问题&#xff0c;网络一直不对&#xff0c;又开始重新看一下。 相信很多朋友长时间不看也忘了&#xff0c;所以&#xff0c;这里…

UG NX二次开发(C#)-单选对话框UF_UI_select_with_single_dialog的使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、UF_UI_select_with_single_dialog函数3、实现代码3.1 利用委托创建一个方法3.2 直接调用1、前言 对于单选对话框,采用C++/C写的时候比较容易,也在帮助文档中有示例,但是对于C#开发采…

STL库中的string

文章目录 一、STL的六大组件二、string类2.1string中的size()方法2.2隐式类型的转换2.3string的多种构造2.4string中size与length是否有差异&#xff1f;2.4string中的capacity2.5string中的push_back和append2.6string中运算符重载operator2.7string中的reserve扩容2.8string中…

DJI RONIN 4D变0字节恢复案例

RONIN 4D这个产品听起来比较陌生&#xff0c;还是DJI大疆出品。没错&#xff0c;这是大疆进军影视级的重点明星机型。前阵子刚处理过大疆RONIN 4D的修复案例&#xff0c;下边这个案例是和exfat有关的老问题:文件长度变成0字节。 故障存储:希捷18T /MS Exfat文件系统。 故障现…

Mac上使用M1或M2芯片的设备安装Node.js时遇到一些问题,比如卡顿或性能问题

对于Mac上使用M1或M2芯片的设备可能会遇到在安装Node.js时遇到一些问题&#xff0c;比如卡顿或性能问题。这可能是因为某些软件包或工具在M1或M2芯片上的兼容性不佳。为了解决这个问题&#xff0c;您可以尝试以下方法&#xff1a; 1. 使用Rosetta模式 对于一些尚未适配M1或M2…

vscode 运行 java 项目之解决“Build failed, do you want to continue”的问题

Visual Studio Code运行 java 起来似乎比 IDEA 更轻量、比 eclipse 更友好&#xff0c;是不可多得的现代编译法宝。 安装好官方推荐的 java 扩展包后&#xff0c;就可以运行 java 代码了。功能 比 code runner 强&#xff0c;支持 gradle、maven、普通java项目&#xff0c;运行…

第五十九回 公孙胜芒砀山降魔 晁天王曾头市中箭-飞桨自然语言处理套件PaddleNLP初探

公孙胜献出八卦阵&#xff0c;宋江用八员大将守阵。项充李衮进入阵里&#xff0c;被抓住了。宋江说久闻大名&#xff0c;来梁山吧。两人说誓当效力到死&#xff0c;希望能先放我们两个回去把樊瑞带来一起。见到樊瑞后把宋江讲义气一说&#xff0c;樊瑞说不可逆天&#xff0c;于…

python flask报错OSError: [WinError 10038] 在一个非套接字上尝试了一个操作。

根本原因&#xff1a; 在执行到某个代码的时候&#xff0c;出错了&#xff0c;这个服务器的连接崩了&#xff0c;导致连接提前关闭。 针对的情况&#xff1a; 检查一下这个中文的报错的下面有没有这行 “ * Restarting with watchdog (windowsapi)” 上面某个地方应该还有这行…

HTML_CSS练习:HTML注释

一、代码示例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>HTML注释</title> </head> <body><marquee loop"1">马龙强<!--下面的输入框是可以滚动的&#x…

黑马微服务p30踩坑

报错详情 : orderservice开不起来 : 发生报错 : 然后检查了以下端口啥的 &#xff0c;配置啥的都是没有问题的 ; 解决办法 : 1 . 修改nacos1,2,3中的端口&#xff0c;将conf 中 cluster.conf中 的 127.0.0.1 全部改成自己本机的真实ipv4地址; 本机真实ipv4地址查看 :…

云原生(二)、Docker基础

Docker Docker 是一种开源的容器化平台&#xff0c;用于开发、部署和运行应用程序。它允许开发者将应用程序及其所有依赖项打包到一个可移植的容器中&#xff0c;这个容器可以在任何支持 Docker 的环境中运行&#xff0c;无论是开发人员的个人笔记本电脑、测试环境、生产服务器…

Docker使用(三)Docker底层分析

Docker使用(三)Docker底层分析 四、底层分析 1、Docker镜像原理 1.1 commit镜像 docker commit 提交容器成为一个新的副本 # 命令和git原理类似 docker commit -m“提交的描述信息” -a“作者” 容器id 目标镜像名:[TAG] 实操&#xff1a; # 1、启动一个默认tomcat # …

【目标检测-数据集准备】DIOR转为yolo训练所需格式

【目标检测】DIOR遥感影像数据集&#xff0c;转为yolo系列模型训练所需格式。 标签文件位于Annotations下&#xff0c;格式为xml&#xff0c;yolo系列模型训练所需格式为txt&#xff0c;格式为 class_id x_center,y_center,w,h其中&#xff0c;train&#xff0c;text&#xff…

数据结构 之 队列(Queue)

​​​​​​​ &#x1f389;欢迎大家观看AUGENSTERN_dc的文章(o゜▽゜)o☆✨✨ &#x1f389;感谢各位读者在百忙之中抽出时间来垂阅我的文章&#xff0c;我会尽我所能向的大家分享我的知识和经验&#x1f4d6; &#x1f389;希望我们在一篇篇的文章中能够共同进步&#xff0…

数据结构知识点汇总(持续更新版)

数据结构 一、绪论 检测知识&#xff1a; 1.1基本概念 以前的计算机 弹道计算机 现如今 主要运用于非数值的计算 基本概念和术语 数据&#xff1a;是信息的载体&#xff0c;描述客观事物属性的值&#xff0c;字符以及所有能输入到计算机中并被计算机程序识别和处理的符号的…

vite打包流程和原理

文章目录 打包原理Vite比Webpack快&#xff1f;在生产环境下的表现启动项目后&#xff0c;完成加载比较慢&#xff1f;Esbuild & Rollup热更新 打包原理 vite利用了ES module这个特性&#xff0c;使用vite运行项目时&#xff0c;首先会用esbuild进行预构建&#xff0c;将所…

Java 根据IP获取IP地址信息(离线)

<!-- https://mvnrepository.com/artifact/org.lionsoul/ip2region --><dependency><groupId>org.lionsoul</groupId><artifactId>ip2region</artifactId><version>2.7.0</version></dependency> 地址&#xff1a;http…

影响交易收益的因素有哪些?

在尝试做交易时&#xff0c;你可能会问自己一个问题&#xff1a;交易一天能赚多少钱&#xff1f;“如果我全职投入交易&#xff0c;一天能赚多少&#xff1f;”或者更广泛地说&#xff0c;“交易能为我带来怎样的财富&#xff1f;”这些问题本质上都充满了不确定性&#xff0c;…

PCM和I2S区别

I2S和PCM接口都是数字音频接口&#xff0c;而所见的蓝牙到cpu以及codec的音频接口都是用PCM接口&#xff0c;是不是两个接口有各自不同的应用呢&#xff1f;先来看下概念。 PCM&#xff08;PCM-clock、PCM-sync、PCM-in、PCM-out&#xff09;脉冲编码调制&#xff0c;模拟语音信…