C语言 strstr函数的用法及模拟实现strstr函数-程序员宅基地

技术标签: c语言  字符串  

C语言 strstr函数的用法及模拟实现strstr函数

一、strstr函数的用法

1.strstr函数原型:char* strstr(const char* str1,const char* str2)
2.功能:strstr()是一个参数为两个字符指针类型,返回值是char*类型的函数,它用于找到子串(str2)在一个字符串(str1)中第一次出现的位置。这里因为传进来的地址指向的内容不会在发生改变,所以我们在两个形参(char*)前加上const.
3.包含在string.h头文件中
4.代码实践

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

int main()
{
    
	const char* p1 = "abcdefgh";//"abcdefgh"是常属性字符串,里面的内容无法被改变,在char*前加const
	const char* p2 = "def";
	char* ret = strstr(p1, p2);//把返回的字符串首地址赋给ret
	if (ret == NULL)
	{
    
		printf("子串不存在\n");//当返回的字符串首地址为空,ret为一个空指针,代表不存在该子串
	}
	else
	{
    
		printf("%s\n", ret);//当返回的字符串首地址不为空,则会从字符串首地址开始打印,到‘\0’停止
	}

	return 0;
}

结果:
在这里插入图片描述

二、模拟实现strstr函数的功能

1.代码实现

#include <stdio.h>
#include <assert.h>
#include<string.h>
char* my_strstr(const char* p1, const char*p2)//参照strstr函数原型构建自己的strstr函数
{
    
	assert(p1 != NULL);//断言该指针不为空指针
	assert(p2 != NULL);
	char*s1 = NULL;//创建一个空指针;
	char*s2 = NULL;
	char*cur = p1;
	if (*p2 == '\0')
	{
    
		return (char*)p1;                    //如果我们所要找的子串p2为'\0',返回总串的首元素地址
	}

	while (*cur)//cur代表指向的是子串第一次出现的首元素地址
	{
    
		s1 = cur;                      //把cur指向字符串的首元素地址赋给s1
		s2 = (char*)p2;                    //把p2指向的首元素地址赋给s2,每一次循环都要从p2的首元素地址开始重新比较
		while ((*s1 != 0) && (*s2 != 0) && *s1 == *s2)           //只有在s1指向的首元素地址,s2指向的首元素地址都不为'\0'的时候,才可以在总串中找子串的首地址第一次出现的时候
		{
                                                // 比较s1,s2指向的地址所对应的字符是否相等,若相等,各自指向的地址向后跳一个字节比较下一位是否相等在满足以上的条件下不断循环,若不满足,
			s1++;                                    //开始一下比较
			s2++;
		}
		if (*s2 == '\0')             //若经过上面的比较,s2指向的内容恰好是'\0',代表找到子串首次出现的地址
		{
                                  //若不满足以上情况的比较,开始以下比较
			return (char*)cur;
		}
		if (*s1 == '\0')  
		{
    
			return NULL;            //若在s2指向的内容不为'\0'时,s1指向的内容率先为0,代表总串长度比子串长度短,必不存在子串,返回一个空指针
		}
		cur++;//代表当前cur指向的并不是子串第一次出现的首元素地址,指向的地址要往后跳一个字节
	}

	return NULL;//如果经过以上比较都不能得出结果,代表找不到子串,要返回空指针

}

int main()
{
    
	const char* arr1 = "abbbcdefg";
	const char* arr2 = "bbc";
	char* ret = my_strstr(arr1, arr2);
	if (ret == NULL)
	{
    
		printf("子串不存在\n");
	}
	else
	{
    
		printf("找到了 子串为:%s\n", ret);
	}

	return 0;
}

结果·:
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_62677583/article/details/121353929

智能推荐

多大密西沙加计算机科学与技术,多伦多大学第二大校区——密西沙加校区专业及双录取介绍...-程序员宅基地

文章浏览阅读1.3k次。原标题:多伦多大学第二大校区——密西沙加校区专业及双录取介绍多伦多大学 (University of Toronto,简称U of T,UT),始建于1827年,坐落在加拿大第一大城市多伦多,起源于公元1827年的国王学院King's College。 多伦多大学亦为美国大学协会中仅有的两所非美国学府之一(另一所即为著名的麦吉尔大学)。多伦多大学每年发表的科研论文数量在北美仅次于哈佛大学,引用数量..._多伦多大学密西沙加校区计算机科学专业

Vue+Element-UI Table表头排序_element ui table 排序-程序员宅基地

文章浏览阅读4.1k次,点赞2次,收藏6次。Vue+Element-UI Table表头排序Vue代码定义后台需要接受的排序属性排序sortChangeVue代码<el-table v-loading="loading" :data="standardList" @sort-change='sortChange'> <el-table-column label="序号" prop="id" width="80" sortable='custom'/></el-table>在<el-tab_element ui table 排序

Verilog HDL 同步复位和异步复位(转)_同步复位与异步复位verilog-程序员宅基地

文章浏览阅读7.4k次,点赞5次,收藏68次。目录1、同步复位2、异步复位3、同步/异步复位对比4、异步复位同步释放4.1、异步复位同步释放原理在实际的工程中选择复位策略之前必须考虑许多设计方面的问题,如使用同步复位或者异步复位或者异步复位同步释放(Asynchronous Reset Synchronous Release或者Synchronized Asynchronous Reset),以及是否每一个触发器..._同步复位与异步复位verilog

IDEA Mapper文件直接跳转到xml文件的方法(安装插件MyBatisX)_mapper跳转xml的插件-程序员宅基地

文章浏览阅读9.1k次,点赞8次,收藏11次。IDEA Mapper文件直接跳转到xml文件的方法(安装插件MyBatisX)_mapper跳转xml的插件

python解析wav语音文件_python查看.wav编码格式-程序员宅基地

文章浏览阅读3.7k次,点赞3次,收藏17次。说明本文主要使用python编程,实现解析wav语音文件,得到.wav语音文件的声道数,量化位数,采样频率,采样点数。编写python程序使用pycharm。下面简单介绍一下wav文件结构。一 解析.wav文件原理WAVE文件本质上就是一种RIFF格式,它可以抽象成一颗树(数据结构的一种)来看。​ 如图所示,从上到下分别对应着二进制数据在文件中相对于起始位置的偏移量。每一个格子对应一..._python查看.wav编码格式

DP mixture model-程序员宅基地

文章浏览阅读65次。http://people.csail.mit.edu/jacobe/software.html转载于:https://www.cnblogs.com/stoneresearch/archive/2011/09/03/4336539.html_dpmm饭圈

随便推点

APP的支付方式及特点_app支付渠道和主体不同-程序员宅基地

文章浏览阅读110次。需要注意的是,中国国内的支付方式可能在不同的应用和商户中有所不同,用户和开发者可以根据应用的需求选择合适的支付方式。此外,中国的支付生态系统也在不断演变和创新,新的支付方式和技术不断涌现,以满足用户和市场的需求。微信支付是腾讯旗下的支付服务,允许用户使用微信APP进行支付、转账、购物等。它也支持扫描二维码进行支付。除了上述主要支付方式外,还有一些其他第三方支付平台,如快钱、易宝支付、翼支付等,它们提供在线支付和服务。QQ钱包是腾讯提供的支付服务,用户可以在QQ及其关联应用上使用,支持多种支付方式。_app支付渠道和主体不同

聊城大学计算机学院宿管部,计算机学院-程序员宅基地

文章浏览阅读257次。聊城大学计算机学院文件计算机学院发【2015】6号计算机学院学生考勤管理规定为不断加强和优化学院学风建设,进一步规范学院教学秩序和生活秩序,督促学生积极参加并高质量完成学校学院规定的学习任务和各项活动,使其在德智体美劳等方面得到全面发展,根据《聊城大学学生考勤管理规定》等有关文件精神,结合我院实际,制定本规定。第一条学生应自觉遵守学校学院纪律,按时参加教学计划和学校、学院统一安排、组织的一切活动。..._聊城大学计算机学院让出去住吗

RHEL7xfs文件系统备份恢复-程序员宅基地

文章浏览阅读292次。实战:xfs文件系统的备份和恢复XFS提供了 xfsdump 和 xfsrestore 工具协助备份XFS文件系统中的数据。xfsdump 按inode顺序备份一个XFS文件系统。与传统的UNIX文件系统不同,XFS不需要在dump前被卸载;对使用中的XFS文件系统做dump就可以保证镜像的一致性。这与XFS对快照的实现不同,XFS的dump和restore的过程是可以被中断然后继续的,无须冻结文..._error: cannot dump to /data/data_backup file type 4000

在colab上运行GitHub项目_colab运行github项目-程序员宅基地

文章浏览阅读4.7k次,点赞4次,收藏40次。运行我们这个项目,注意,我们当前是在仓库(Bert-Chinese-Text-Classification-Pytorch)的这个目录下,故可以直接使用如下命令,不然记得给文件(run.py)加上前缀,例如:/content/drive/MyDrive/Colab Notebooks/Bert-Chinese-Text-Classification-Pytorch/run.py。有点背,开了pro会员,还是背分到了T4,/(ㄒoㄒ)/~~科学上网、拥有谷歌邮箱、谷歌云端硬盘、colab注册。_colab运行github项目

ArcGIS去除黑边方法汇总_图像去黑边-程序员宅基地

文章浏览阅读1.6k次。在使用ArcGIS对影像进行应用的时候,如果出现了黑边,除了影响美观之外,进行镶嵌处理也可能会有问题,这里,我们介绍一下几种ArcGIS去除黑边的方法,希望能够对大家有所帮助。_图像去黑边

Halcon 画 ROI 区域并生成区域(draw_circle,gen_circle,draw_ellipse, gen_ellipse,draw_rectangle1, gen_rectangl)_wpf halcon 绘制roi-程序员宅基地

文章浏览阅读757次。1)常用的画区域,生成区域 (draw_circle,gen_circle,draw_ellipse, gen_ellipse,draw_rectangle1, gen_rectangle1, draw_rectangle2, gen_rectangle2, draw_region, draw_line,gen_region_line, gen_region points等);draw_算子,运行到该行后,需用鼠标画出需要形状,然后单击右键,停止并确认绘制;矩形轮廓边缘 像素为单位。_wpf halcon 绘制roi

推荐文章

热门文章

相关标签