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");elseprintf("找到了:%s\n", ret);char arr1[] = "abbbcdef\n";const char* p2 = "bbc";char* re = my_strstr(arr1, p2);if (p2 == NULL)printf("没找到。");elseprintf("找到了:%s\n", re);printf("找到了:%s\n", arr1);return 0;
}

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

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

相关文章

layuiAdmin-通用型后台模板框架【广泛用于各类管理平台】

1. 主页 1.1 控制台 2. 组件 3. 页面 3.1 个人主页 3.2 通讯录 3.3 客户列表 3.4 商品列表 3.5 留言板 3.6 搜索结果 3.7 注册 3.8 登入 3.9 忘记密码 4. 应用 4.1 内容系统 4.1.1 文章列表 4.1.2 分类管理 4.1.3 评论管理 4.2 社区系统 4.2.1 帖子列表 4.2.2 回…

串行通信——IIC总结

一.什么是IIC&#xff1f; IIC&#xff08;Inter-Integrated Circuit&#xff09;也称I2C&#xff0c;中文叫集成电路总线。是一个多主从的串行总线&#xff0c;由飞利浦公司发明的通讯总线&#xff0c;属于半双工同步传输类总线&#xff0c;仅由两条线就能完成多机通讯&#…

【一】【单片机】有关LED的实验

点亮一个LED灯 根据LED模块原理图&#xff0c;我们可以知道&#xff0c;通过控制P20、P21...P27这八个位置的高低电平&#xff0c;可以实现D1~D8八个LED灯的亮灭。VCC接的是高电平&#xff0c;如果P20接的是低电平&#xff0c;那么D1就可以亮。如果P20接的是高电平&#xff0c;…

第四百零三回

文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了自定义缓冲组件相关的内容&#xff0c;本章回中将介绍一个和它类似的组件&#xff1a;下拉刷新组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在本章回介绍的下拉刷新组件叫RefreshIndicator&a…

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

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

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

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

hololens2发布unity设置

生成vs工程再向hololens发布时&#xff0c; Architecture选X64或ARM64都可以成功发布

iOS面试题锦集

1. 问&#xff1a;一张图片所占内存大小跟什么有关&#xff1f; 图片所占内存大小&#xff0c;与图片的宽高有关 我们平时看到的png、jpg、webp这些图片格式&#xff0c;其实都是图片压缩格式。通过对应的算法来优化了大小以节省网络传输与本地保存所需的资源。 但是当我们加…

Adobe PDF背景设置护眼模式,缓解眼部疲劳

一、背景 在用Adobe PDF看论文时&#xff0c;默认的白色背景看久了&#xff0c;眼睛会特别疲劳&#xff0c;下面介绍如何设置背景为护眼模式。 二、设置PDF为护眼模式 使用Adobe Acrobat Pro DC打开任意PDF文件&#xff0c;在上方工具栏选择“编辑”&#xff0c;在下拉菜单栏…

塑料工厂5G智能制造数字孪生可视化平台,推进塑料行业数字化转型

塑料工厂5G智能制造数字孪生可视化平台&#xff0c;推进塑料行业数字化转型。塑料制造行业作为重要的工业领域&#xff0c;亟需借助这一平台实现产业升级与转型&#xff0c;以适应市场的变化和提高生产效率。传统的塑料制造过程往往存在生产效率低下、资源浪费、环境污染等问题…

数据结构 之 队列(Queue)

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

HTML + CSS 高频考点之 - 定位

简述&#xff1a; 补充固定定位也会脱离文档流、不会占据原先位置 1、什么是文档流 文档流是指HTML文档中元素排列的规律和顺序。在网页中&#xff0c;元素按照其在HTML文档中出现的顺序依次排列&#xff0c;这种排列方式被称为文档流。文档流决定了元素在页面上的位置和互相之…