模拟实现strstr函数,通俗易懂!!!

news2025/2/1 1:45:44

函数介绍

函数声明

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

头  文  件:#include <string.h>
返  回  值: 返回值为char * 类型( 返回指向 str1 中第一次出现的 str2 的指针);如果 str2 不是 str1 的一部分,则返回空指针。

 

官方案例:网址strstr - C++ Reference

/* strstr example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] ="This is a simple string";
  char * pch;
  pch = strstr (str,"simple");
  if (pch != NULL)
    strncpy (pch,"sample",6);
  puts (str);
  return 0;
}

函数实现

1.首先我们要输入两个字符数组,使用gets函数使这个函数变得更加灵活!

2.然后我们要将两个数组的首地址传给形参

3.传给形参之后我们要判断他们不能是空指针,否则就没有意义了

4.由于我们寻找的是b在a中第一次出现的位置(a数组中要完全包含b数组,(b数组要完全的连续的出现在a中)

我们这个时候需要两个指针起始这两个指针都是指向a(首元素的地址)。

第一个指针(a)是用来判断是否元素和b中元素相等的。

假如这两个这两个字符数组真的有重复的部分,第二个指针(cur)是用来返回  第二个数组与第一个数组重复的起始位置!以便于我们找到打印的起始位置!!

5.当然我们也可以使用固定的字符串来判断。

#include <stdio.h>
#include <string.h>
#include <assert.h>

char * My_strstr(char * a,char *b)
{
	assert(a && b);
	char* cur = a;//创造一个和a一样的地址

	while (*cur)// *cur 如果cur指向'\0' 他在内存中储存的ASCII便为0,便不能进入循环
	{
		while (*a && *b && (*a == *b))
//只有当*a *b 不等于0 并且两个相等,才能进入循环,这是为了判断两个字符数组是否有相等的部分
		{
			a++;
			b++;
		}
		if (*b == '\0')
//这时判断*b 是否为 \0 如果为 , 
//则返回他们最开始重复的部分,只有b在a中完全出现,这一步才会运行 
		{
			return cur;
		}

//如果没有判断出来,我们将a向后移一位,接着判断!
		a++;
		cur++;
	}
	return NULL;
}

int main()
{
	char a[50];
	gets(a);

	char b[50];
	gets(b);

	//const char* a = "abcdefg";
	//const char* b = "cde";
	
	char * ret = My_strstr(a, b);


	if (ret == NULL)
	{
		printf("未找到;>");
	}
	else 
	{
		
		printf("%s ", ret);
	}
	
	//printf("%s\n",ret);
}

 

如有错误,欢迎指正!!!

希望各位大佬看完点个赞!

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

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

相关文章

Webots R2021a教程

文章目录 Windows安装设置中文打开世界添加贴图 为外部控制器配置Anaconda解决报错&#xff1a;CondaSSLError: Encountered an SSL error. Most likely a certificate verification issue.调用Python API Windows 安装 进入下载页面 https://github.com/cyberbotics/webots/r…

CSS实现几种常见布局

CSS实现几种常见布局 两列左窄右宽型布局 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" co…

【面试题】2023前端面试系列-- Vue 篇

大厂面试题分享 面试题库 前后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 web前端面试题库 VS java后端面试题库大全 Vue 常见面试题总结 MVVM模型&#xff1f; MVVM&#xff0c;是Model-View-ViewModel的简写…

001docker架构介绍

docker 官网Choose the best method for you to install Docker Engine. This client-server application is available on Linux, Mac, Windows, and as a static binary.https://docs.docker.com/engine/install/ 介绍 Docker用Go编程语言编写&#xff0c;并利用Linux内核的…

算法刷题-链表-两两交换链表中的节点

两两交换链表中的节点 24. 两两交换链表中的节点思路其他语言版本 24. 两两交换链表中的节点 力扣题目链接 给定一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后的链表。 你不能只是单纯的改变节点内部的值&#xff0c;而是需要实际的进行节点交换。 思…

黄金回收小程序开发功能有哪些?

一、用户端&#xff1a; 1、实时查询&#xff1a;通过对接三方接口实现实时金价动态查看&#xff1b; 2、多种类珠宝实时回收&#xff1a;小程序支持多品类珠宝的实时回收包含黄金饰品、金条、铂金、K金、白银等&#xff0c;同步实现价格实时更新&#xff1b; …

计算机内核态、用户态和零拷贝技术详解

存储介质的性能 话不多说&#xff0c;先看一张图&#xff0c;下图左边是磁盘到内存的不同介质&#xff0c;右边形象地描述了每种介质的读写速率。一句话总结就是越靠近cpu&#xff0c;读写性能越快。了解了不同硬件介质的读写速率后&#xff0c;你会发现零拷贝技术是多么的香&a…

JDBC 事务和批处理 详解(通俗易懂)

目录 一、前言 二、事务 1.事务介绍 : 2.事务处理 : Δ准备工作 Δ不使用事务的情况 Δ使用事务的情况 三、批处理 1.介绍 : 2.常用方法 : 3.应用 : 4.源码分析(JDK17.0版本&#xff09; : 四、总结 一、前言 第四节内容&#xff0c;up主要和大家…

阿里背调,征信不好也会被pass

大厂背调&#xff0c;我一直认为是唬人的&#xff0c;走下流程而已&#xff0c;没想到这么严格。这次提供的背调信息&#xff0c;我填写了上家公司三个联系人&#xff0c;HR、领导、同事&#xff1b;上上家公司三个联系人&#xff0c;HR、领导、同事。根据朋友的反馈来看&#…

python 第五章 列表list [ ]

系列文章目录 第一章 初识python 第二章 变量 第三章 基础语句 第四章 字符串str 文章目录 5.1列表的应用场景5.2列表的格式5.3列表的常用操作查找下标函数查找函数index()count()len() 判断是否存在innot in 增加append()extend()insert() 删除delpop()remove()clear() 清空列…

Java并发回顾

树叶柔和爽朗的呼吸 诗人一路吹着口哨回家 一路踢着石子妙想连篇 感到夕阳和晚风自古多情 自己现在和将来 都是个幸福的人 系列文章目录 Java常见知识点汇总Java集合回顾Java并发回顾… 文章目录 系列文章目录什么是线程和进程?线程与进程的关系,区别及优缺点&#xff1f;图解…

Tcp的三次握手及netty和实际开发如何设置全连接队列参数

上图 第一次握手&#xff0c;client 发送 SYN 到 server&#xff0c;状态修改为 SYN_SEND&#xff0c;server 收到&#xff0c;状态改变为 SYN_REVD&#xff0c;并将该请求放入 sync queue 队列 第二次握手&#xff0c;server 回复 SYN ACK 给 client&#xff0c;client 收到…

【Prometheus】mysqld_exporter采集+Grafana出图+AlertManager预警

前提环境&#xff1a;已经安装和配置好prometheus server 所有组件对应的版本&#xff1a; prometheus-2.44.0 mysqld_exporter-0.14.0 grafana-enterprise-9.1.2-1.x86_64.rpm alertmanager-0.25.0 prometheus-webhook-dingtalk-2.1.0 简介 mysql_exporter是用来收集MysQL或…

spring 事务超时

Transactional(timeout 10) 表示设置事务的超时时间为10秒 表示超过10秒如果该事务中所有的DML语句还没有执行完毕的话&#xff0c;最终结果会选择回滚 默认值-1&#xff0c;表示没有时间限制。 如果最后一条DML语句后面还有很多业务逻辑&#xff0c;这些业务代码执行的时间不…

setState详解

this. setState( [partialState], [callback]) 1.[partialState] :支持部分状态更改 this, setState({ x:100 //不论总共有多少状态&#xff0c;我们只修改了x&#xff0c;其余的状态不动 });callback :在状态更改/视图更新完毕后触发执行&#xff0c;也可以说只要执行了setS…

lightGBM的介绍

一、lightGBM的介绍 1.lightGBM的演进过程 2.AdaBoost算法 AdaBoost&#xff08;Adaptive Boosting&#xff09;是一种集成学习算法&#xff0c;通过组合多个弱分类器来构建一个强分类器。它是由Freund和Schapire在1996年提出的&#xff0c;是集成学习中最早被广泛应用的算法…

JDK8-1-Lambda表达式(5)-复合 Lambda 表达式

JDK8-1-Lambda表达式&#xff08;5&#xff09;-复合 Lambda 表达式 JDK8 在 java.util.function 包下定义了一些默认的 函数式接口 &#xff0c;如 Predicate、Consumer、Function、 Comparator &#xff08;在 java.util.包下&#xff09; &#xff0c;这些接口提供了一些复…

运营-21.常见的内容生产方式

常见的 内容生产方式 PGC&#xff08;Professionally-generated Content&#xff09;专业生产内容 传统的门户网站内容生产方式&#xff0c;内容多由官方工作人员身或者专业的内容创造者&#xff08;比如新闻记者等&#xff09;创造。 UGC&#xff08;User Generated Content&a…

【好书精读】网络是怎样连接的 浏览器生成消息

如果只是讲解 TCP/IP 、 以太网这些单独的技 术 &#xff0c; 读者就无法理解网络这个系统的全貌 &#xff1b; 如果无法理解网络的全貌 &#xff0c; 也 就无法理解每一种网络技术背后的本质意义 &#xff1b; 而如果无法理解其本质意义 &#xff0c; 就只能停留在死记硬背的…

MMDetection代码实战

title: mmdet代码实战 date: 2023-06-10 17:01:45 tags: [detection,pytorch] MMDetection代码实战 这一届主要讲解了&#xff0c;如何构建cfg&#xff0c;如何在目标检测上设置自己的配置文件。主要的思维导图如下 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下…