详解strstr函数:查找子字符串函数及其模拟实现

2023-05-16

详解strstr函数:在一个字符串中查找另一共字符串是否存在!

对于strstr查找子字符串,笔者如果不是对C语言学习的更加深入,可能还是不知道有这个函数!!!之前,我们在一个字符串里面查找另外一共字符串都是用指针来遍历整个字符串来查找!!!现在相信各位老铁通过对此博客的学习,等到心有感悟的时候,便能使用该strstr函数来查找了!简单了不少!

对于 strstr查找子字符串函数的语法有:

//在C++中:const char * strstr ( const char * str1, const char * str2 );
//在C中  :      char * strstr (       char * str1, const char * str2 );

需要注意的是,返回值的类型为:char*类型的指针!!

显而易见的就是:在字符串str1里面查找是否含有字符串str2!!

 比如:在字符串str1[]="abcdefabcdefabcdef"里面查找是否含有字符串arr2[]="fab"!!!

如果存在,返回的是子串第一次所在的起始位置!

如果不存在,返回的是:NULL(空指针)

但是在str1[]="abcdefabcdefabcdef"含有两次arr2[]="fab",只返回第一次出现的位置!!

请看代码:

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

int main()
{
	char arr1[] = "abcdefabcdefabcdef";
	char arr2[] = "fab";
	char* p = strstr(arr1, arr2);
	if (p == NULL)
	{
		printf("不存在\n");
	}
	else
	{
		printf("%s\n", p);
	}
	return 0;
}

因为 strstr函数的返回值类型为char*类型的指针!!所以需要用char*类型的指针来接收!所以定义了char *p!!当返回值为NULL的时候,打印不存在,否则,打印出来:将p当作起始地址的字符串!!

代码的运行结果为:

 但是对于返回的是否是第一次出现的位置??想必各位老铁可能心存疑惑!!但是,经过上面的代码的运行结果,想必大家也能解决掉该疑惑了吧!!!

下面进入最精彩的部分!strstr函数的模拟实现!!也到了压轴的部分了!请睁大眼睛看仔细。

情况1.

s1与s2这两个指针不相等,s1++;,当s1与s2这两个指针相等的时候,p此时记录的是s1处的位置,s1++;s2++;各往后走一步,一直到s2走完!!

情况2:

 

当s1与s2不相等时,此时p记录的为b的位置,则p从c的位置开始往后找!!

情况3:

 第一趟走的时候,发现不相等,对于str2,指针重新回到原处,str1++;继续往后找!!

经过上面的简单分析:我们可以得出下面的代码:

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

char* my_strstr(const char* str1, const char* str2)
{
	const char* s1 = str1;
	const char* s2 = str2;
	const char* p = str1;

	while (*p)
	{
		s1 = p;
		s2 = str2;
		while (*s1 != '\0' && *s2 != '\0' && (*s1 == *s2))
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return p;
		}
		p++;
	}
	return NULL;  //找不到子串
}

int main()
{
	char arr1[] = "abcdefabcdef";
	char arr2[] = "cde";
	char* p = my_strstr(arr1, arr2);
	if (p == NULL)
	{
		printf("不存在\n");
	}
	else
	{
		printf("%s\n", p);
	}
	return 0;
}

解析:

1.对于第一个while循环里面:while(*p) 中的*p如果不等于’\0‘就进入!

2.对于:s1 = p; 认为在p处位置可能匹配成功,讲p赋值给s1,让s1遍历往后走,看看能不能匹配成功!

3.对于:s2 = str2; 将s2回到起始位置!

4.对于p++; 当s1与 s2不相等的时候,p++,使得p往后走,跳过刚刚匹配的位置,重新进入while循环,再次进行判断!!

用上述代码在:abbbcdef里面查找bbc的主要过程:

 解析为:

将str1与 str2分别指向两个字符串的起始地址!并通过    const char* s1 = str1;    const char* s2 = str2; 也让s1 和s2分别指向两个字符串的起始位置!!指针p也在开始的时候指向str1的位置,让s1 与s2指向的两个位置比较一下,发现不相等,让p往后走(p++),再通过s1=p,将p的位置赋值给s1,s2回到起始位置,将s1 与s2进行比较,相等的话,s1++; s2++; 都往后走,判断又相等,再往后走,发现s1指向b,s2指向c,不相等,则p++;使p往后再走一步,再通过s1=p将s1回到p指向的位置处,通过s2=str2,再将s2回到初始位置,重新进行比较,当两个字符串有一个遇见'\0'时,就会停下来!!

上面内容就是主要的解析!!请各位老铁仔细品味!!

最后,此处代码的运行结果为:

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

详解strstr函数:查找子字符串函数及其模拟实现 的相关文章

  • 28. Implement strStr()

    public class Solution public int strStr String haystack String needle int next 61 new int needle length generateNextArra
  • 详解strstr函数:查找子字符串函数及其模拟实现

    详解strstr函数 xff1a 在一个字符串中查找另一共字符串是否存在 xff01 对于strstr查找子字符串 xff0c 笔者如果不是对C语言学习的更加深入 xff0c 可能还是不知道有这个函数 xff01 xff01 xff01 之
  • C语言字符串函数strstr的详细解释

    在C语言中 xff0c strstr xff08 xff09 函数是一个字符串处理函数 xff0c 它用于在一个字符串中查找另一个字符串的出现位置 函数原型为 xff1a char strstr const char str1 const
  • 模拟实现strchr,strrchr,strstr,strrstr函数

    模拟实现strchr strnchr strstr strrstr函数 strchr 查找字符串s中首次出现字符c的位置 xff0c 返回首次出现c的位置的指针 xff0c 如果s中不存在c则返回NULL include lt stdio
  • C语言strstr函数

    函数strstr定义 xff1a char strstr const char str1 const char str2 xff1b 位于头文件 string h 中 作用 xff1a strstr函数用于判断字符串str2是否为字符串st
  • 有意思的字符串查找函数strchr,strrchr,strstr,strrstr

    通过一段时间对字符串的了解 xff0c 我发现了许多有意思的字符串函数 xff0c 下面我们就以常见的字符串查找函数 strchr strrchr strstr strrstr为例来模拟实现这些有意思的字符串查找函数吧 xff01 strc
  • C语言字符串查找基础----strchr()、strrchr()、strpbrk()、strstr()

    1 查找一个字符 在一个字符串查找一个特定字符最容易的方法是使用strchr和strrchr函数 xff0c 原型如下所示 xff1a char strchr char const str int ch char strrchr char
  • C/C++库函数strstr和find实现子字符串查找

    1 子字符串查找实现Demo include
  • C/C++实现strstr函数、KMP算法查找子串

    C C 实现strstr KMP算法查找子串 目录 C C 实现strstr KMP算法查找子串 1 字符串形式 2 字节流形式 1 字符串形式 代码实现 char my strstr const char src const char d
  • strstr 的优化版本(搜索具有恒定长度)

    我的 C 程序有很多 strstr 函数调用 标准库 strstr 已经很快 但在我的例子中 搜索字符串的长度始终为 5 个字符 我用一个特殊版本替换了它以获得一些速度 int strstr5 const char cs const cha
  • strstr() 在 gcc 和 VS 中的实现是否具有线性复杂度?

    我知道有快速的字符串搜索算法 例如博耶 摩尔 and 高德纳 莫里斯 普拉特 其复杂度为 O n m 而普通解决方案为 O n m 那么 最流行的工具链 gcc 和 Visual Studio 的 strstr 实现是使用这些快速 O n
  • strstr 的纯字节版本?

    是否有一个 strstr 版本可以在可能包含空字符的固定长度内存上工作 我可以这样表达我的问题 strncpy 与 memcpy 的关系与 strstr 的关系相同 memmem 不幸的是它是 GNU 特定的而不是标准 C 但是 它是开源的
  • 在 PHP 开关中使用 strstr

    我只是想不出代码 我有太多 if 语句 我想将其更改为 switch 语句 但我找不到逻辑 目前我有 if strstr var texttosearch echo string contains texttosearch if strst
  • strstr 显示出现之前的字符串

    我想在针出现后得到字符串的第一个位 如下所示 user strstr email protected cdn cgi l email protection true 但这仅适用于 PHP 版本 5 3 0 我有 5 2 9 有什么办法可以得
  • PHP中获取字符串的第一行

    在 PHP 5 3 中有一个不错的功能 http www php net manual en function strstr php这似乎做我想做的 strstr input n true 不幸的是 服务器运行 PHP 5 2 17 和可选
  • strstr() 的参数计数错误

    我已经使用帖子 GUID 和帖子标题在 WordPress 中构建了一个导航菜单 我只获取标题的一部分 为此我正在执行以下操作 casestudylist li class subnav a href strstr v gt post ti
  • strstr 不工作

    如果我输入 test 为什么这段特定的代码在 strstr 上返回 false char input 100 int main fgets input 100 stdin printf s input if strstr test mess
  • strstr 仅当我的子字符串位于字符串末尾时才有效

    我现在编写的程序遇到了一些问题 strstr outputs my substring only if it s at the end of my string it also outputs some trash characters a
  • 查找输入字符串中的子字符串

    我有这个汇编程序 我需要在我输入的主字符串中找到子字符串 我的问题是 即使我输入了两个完全不同的单词 它总是输出 找到的单词 我不知道我的循环或条件的哪一部分是错误的 请帮我弄清楚 另外 请建议一些可用于检查子字符串的字符串指令 以便我可以
  • C# 中的 strstr() 等效项

    我有两个byte 我想找到第二个的第一次出现byte 在第一个byte 或其中的一个范围 我不想使用字符串来提高效率 翻译第一个byte to a string会效率低下 基本上我相信就是这样strstr 在 C 中做 最好的方法是什么 这

随机推荐

  • 用opencv识别颜色并输出坐标

    1首先安装opencv pip install opencv python 参考https blog csdn net qq 42114833 article details 128648458 spm 61 1001 2014 3001
  • ROS开发(ubuntu)笔记·1

    学习网址 xff1a Introduction GitBook autolabor com cn b站 xff1a 奥特学园 ROS机器人入门课程 ROS理论与实践 零基础教程 哔哩哔哩 bilibili 创建一个ROS Workspace
  • ROS通信机制~话题通信(Publisher&Subscriber)·笔记2

    系列文章目录 xff1a ROS开发 xff08 ubuntu xff09 笔记 1 嘻 嘻的博客 CSDN博客 ROS通信机制 服务通信 server amp client 笔记3 嘻 嘻的博客 CSDN博客 话题通信 理论模型 xff1
  • SDL2.0在linux/ubuntu系统中更新使用指导

    前言 个人喜好原因 xff0c 写OpenGL的程序都喜欢用SDL做框架 xff0c 没有Qt那么臃肿 xff0c 也没有glut那么坑跌 在不失灵活性的情况下保持了自己的轻量 SDL2 0在今年很早的时候时候就发布了 xff0c 几天就来
  • Tensorflow-gpu安装教程(window11和window10一样)

    1 安装最新版Pycharm xff08 最常见的编译器 xff09 下载官网 xff1a https www jetbrains com pycharm 可以安装到D盘 xff0c 版本免费社区版就行 xff0c 推荐装最新版 2 安装最
  • T265 安装(Realsense SDK和Realsense-ros)

    一 写在前面 硬件配置 xff1a Jeston xavier NX 机载电脑 xff0c 板载6002E 设备如图 xff1a T265双目摄像头 二 Realsense SDK和Realsense ros的介绍 在我看来 xff0c R
  • SysTick 定时器的使用

    手册说明 代码模块 SysTick h ifndef SysTick H define SysTick H include 34 system h 34 void SysTick Init u8 SYSCLK void delay us u
  • FreeRTOS互斥量的实验

    互斥量又称互斥信号量 xff08 本质是信号量 xff09 xff0c 是一种特殊的二值信号量 xff0c 它和 信号量不同的是 xff0c 它支持互斥量所有权 递归访问以及防止优先级翻转的特性 xff0c 用于实现对临界资源的独占式处理
  • FreeRTOS cpu利用率简单介绍

    1 CPU 利用率简介 CPU 使用率其实就是系统运行的程序占用的 CPU 资源 xff0c 表示机器在某段时 间程序运行的情况 xff0c 如果这段时间中 xff0c 程序一直在占用 CPU 的使用权 xff0c 那么可 以认为 CPU
  • 直播的推流与拉流如何在uniapp中实现?

    直播的推流和拉流是实现直播功能的两个关键步骤 xff0c 下面是它们的实现方式 xff1a 推流 xff1a 1 采集视频和音频数据 xff1a 使用摄像头和麦克风等设备 xff0c 采集视频和音频数据 2 编码数据 xff1a 将采集到的
  • Windows下GCC安装和使用

    GCC是由GNU开发的编程语言译器 最近复现代码时需要编译源文件 xff0c 总是报错 xff0c 后来查验报错原因后 xff0c 是由于电脑没能安装GCC C 语言编译器用于把源代码编译成最终的可执行程序 但是本人不是很懂编译原理 xff
  • AUTOSAR——AUTOSAR基础

    一 AUTOSAR AUTOSAR全称为 AUTomotive Open System ARchitecture xff0c 译为 汽车开放系统体系结构 二 AUTOSAR核心思想 1 xff09 提倡 在标准上合作 xff0c 在实现上竞
  • 麦克纳姆轮(麦轮)原理

    一 麦轮原理 麦克纳姆轮 xff1a 简称麦轮 xff0c 由轮毂和围绕轮毂的辊子组成 辊子 xff1a 没有动力的从动小滚轮 麦克纳姆轮辊子轴线和轮毂轴线夹角是45度 A轮 xff08 左旋 xff09 与B轮 xff08 右旋 xff0
  • 数据结构——二叉树的先中后序遍历

    本节内容为Bilibili王道考研 数据结构 P43 P45视频内容笔记 目录 一 二叉树的先中后序遍历 1 先中后序遍历 2 举例 3 先中后序遍历和前中后缀的关系 4 代码实现 5 求遍历序列 6 应用 xff1a 求树的深度 二 二叉
  • Ubuntu下使用sshfs/fusemount挂载/卸载远程目录到本地

    Ubuntu下使用sshfs挂载远程目录到本地 访问局域网中其他Ubuntu机器 在不同机器间跳来跳去 很是麻烦 如果能够把远程目录映射到本地无疑会大大方面使用 xff0c 就像Windows下的网络映射盘一样 在Linux的世界无疑也会有
  • 反向代理解决跨域问题

    为什么会产生跨域 js采用的是同源策略 同源策略是指浏览器的一项安全策略 xff0c 浏览器只允许js代码请求和当前所在服务器域名 xff0c 端口号协议相同的数据接口上的数据 xff0c 这就是同源策略 也就是说当协议 xff0c 域名
  • C++ auto关键字 和 基于范围的for循环 语法糖

    目录 auto关键字基于范围的for循环 auto关键字 在C 43 43 11中 xff0c 规定了一个关键字 xff1a auto 下面看一下auto的用法 xff1a span class token keyword int span
  • ubuntu下ROS2-foxy中安装serial串口包

    1 新开一个终端 ctrl 43 alt 43 t 2 因为ros2中还没有集成serial串口包 xff0c 所以需要第三方下载对应serial串口包 xff0c 新建一个文件夹 xff0c 包名字为第三方库 mkdir Third pa
  • 简单输出一个数组

    简单输出一个数组 xff0c 对于数组 xff0c 我想每一个初始C语言的人 xff0c 刚刚经历过了for循环的喜悦 xff0c switch的喜庆 xff0c for循环的挣扎 因此 xff0c 数组应运而来 xff0c 当头一击 xf
  • 详解strstr函数:查找子字符串函数及其模拟实现

    详解strstr函数 xff1a 在一个字符串中查找另一共字符串是否存在 xff01 对于strstr查找子字符串 xff0c 笔者如果不是对C语言学习的更加深入 xff0c 可能还是不知道有这个函数 xff01 xff01 xff01 之