c语言中strstr函数怎么实现_c语言strstr函数怎么写

c语言中strstr函数怎么实现_c语言strstr函数怎么写首先,我们来看strstr函数的使用可见,strstr函数是用来查找字串的一个函数。因为字符串中有“cde”子串,所以代码运行起来结果就是”cdef”。现在,我们已经将strstr函数的作用大概了解了一下,下面开始函数的模拟实现。首先,在cplusplus中搜索strstr可以了解到她返回的类型及参数相关链接:strstr-C++Reference(cplusplus.com)接下来,我们分析实现思路直到s1到了下图的位置,两者相等当*s1==*s2时进入while循环,s1+

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

首先,我们来看strstr函数的使用

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[] = "abccdef";
	char arr2[] = "cde";

	char* ret = strstr(arr1, arr2);
	if (ret == NULL)
	{
		printf("子串不存在\n");
	}
	else
		printf("%s\n", ret);
	return 0;
}

c语言中strstr函数怎么实现_c语言strstr函数怎么写

可见,strstr函数是用来查找 字串的一个函数。

c语言中strstr函数怎么实现_c语言strstr函数怎么写

因为字符串中有“cde”子串,所以代码运行起来结果就是”cdef” 。

现在,我们已经将strstr函数的作用大概了解了一下,下面开始函数的模拟实现。


首先,在cplusplus中搜索strstr可以了解到她返回的类型及参数

 char * strstr ( char * str1, const char * str2 );

相关链接: strstr – C++ Reference (cplusplus.com)


思路

接下来,我们分析实现思路

c语言中strstr函数怎么实现_c语言strstr函数怎么写

 

1.用while循环将*s1与*s2进行比较,由图可见,*s1开始并不相等,所以p++,再将p赋给s1.

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

直到s1到了下图的位置,两者相等

 

c语言中strstr函数怎么实现_c语言strstr函数怎么写

 2.判断是否“cde”在”ccdef“中

当*s1==*s2时进入while循环,s1++,s2++.逐个比较。

当然,用膝盖想也知道(doge.)由于我选择的示例比较特殊,第一次进入循环时,并不能直接判断出来是否“cde”在”ccdef“中,所以跳出循环后p++,s1 = p.进入第二次循环

c语言中strstr函数怎么实现_c语言strstr函数怎么写

并且,s2每次循环后,需要回到原来的位置。所以s2 = str2.

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

现在主体已经实现了,现在只剩下一个问题,就是当s1或者s2指向’\0’该怎么办。

当s1指向’\0’时,p也就指向了’\0’,代表字符串已经被找完了,但是没有找到子字符串”cde”这时,循环while(*p)结束,返回空指针。

当s2指向’\0’时,表示在”abccdef”中找到了”cde“,那么就返回p指向的地址。

char* my_strstr(char* str1, const char* str2)
{
	const char* s1 = str1;
	const char* s2 = str2;
	char* p = str1;
	while (*p)
	{
		s1 = p;
		s2 = str2;
		while (*s1 == *s2 && *s1 != '\0' && *s2 != '\0')
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return p;
		}
		p++;
	}
	return NULL;
}

最后再进行部分优化。进行断言

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

char* my_strstr(char* str1, const char* str2)
{
	assert(str1 && str2);
	const char* s1 = str1;
	const char* s2 = str2;
	char* p = str1;
	while (*p)
	{
		s1 = p;
		s2 = str2;
		while (*s1 == *s2 && *s1 != '\0' && *s2 != '\0')
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return p;
		}
		p++;
	}
	return NULL;
}
int main()
{
	char arr1[] = "abccdef";
	char arr2[] = "cde";

	char* ret = my_strstr(arr1, arr2);
	if (ret == NULL)
	{
		printf("子串不存在\n");
	}
	else
		printf("%s\n", ret);
	return 0;
}

运行结果:

c语言中strstr函数怎么实现_c语言strstr函数怎么写

 

结束

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/184084.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 《增长黑客》节选与笔记[通俗易懂]

    《增长黑客》节选与笔记[通俗易懂]《增长黑客》节选与笔记自序1.1 创业家的黑暗前传1.2 增长黑客的胜利1.3 什么是“增长黑客”1.4 增长黑客的职责和特质1.5 一切用数据说话1.6 增长黑客担任的团队角色1.7 如何招聘增长黑客1.8 如何成为增长黑客1.9 增长黑客的常用工具箱第2章 创造正确的产品2.1 Instagram重生记2.2 PMF,探寻产品与市场的完美契合2.3 拒绝…

    2022年5月13日
    34
  • JS后退一页

    JS后退一页Javascript返回上一页:1.history.go(-1),返回两个页面:history.go(-2);2.history.back().3.window.history.forward()返回下一页4.window.history.go(返回第几页,也可以使用访问过的URL)例:向上一页response.Write(“”) response.W

    2022年7月25日
    12
  • 晚上不用加班了,推荐十款精选IntelliJIdea插件,效率提升N倍[通俗易懂]

    大家好,我是雷小帅,今天给大家推荐开发利器,保证你效率蹭蹭蹭上升。俗话说:"工欲善其事必先利其器",小帅从项目实战的角度在众多的idea插件中挑选了10款开发必备的神器,帮助大家在日常工作学习编码中提升开发效率。1KeyPromoterX实用指数:★★★★★装逼指数:★你还在为记不住快捷键烦恼吗,KeyPromoterX可以帮助你快速记住常用的快捷键。当你在idea中用鼠标点击菜单,它可以显示对应的快捷键以及点击次数。使用一段时间后有助于过渡到更快、无鼠标的开发。

    2022年4月18日
    28
  • 工程机械核心部件寿命预测前三名方案总结与2022年最新方案分享(万文详解)[通俗易懂]

    工程机械核心部件寿命预测前三名方案总结与2022年最新方案分享(万文详解)[通俗易懂]1.比赛学习方法论2.工业寿命预测赛题讲解2.1赛题背景2.2赛题任务和数据介绍2.3评测标准2.4初赛与复赛排行榜2.5数据分析2.6数据预处理2.7特征提取3.前三名数据预处理方法比较4.前三名特征工程方法比较4.1特征构建4.2特征选择5.前三名模型构建比较6.代码与数据7.2022年最新思路分享………

    2022年8月31日
    0
  • matlab高斯型隶属函数,图高斯型隶属函数.PPT[通俗易懂]

    matlab高斯型隶属函数,图高斯型隶属函数.PPT[通俗易懂]图高斯型隶属函数第三章模糊控制的理论基础第一节概述第二节模糊集合第三节隶属函数第四节模糊关系第五节模糊推理在模糊控制中应用较多的隶属函数有以下6种隶属函数。(1)高斯型隶属函数高斯型隶属函数由两个参数和c确定:其中参数b通常为正,参数c用于确定曲线的中心。Matlab表示为(2)广义钟型隶属函数广义钟型隶属函数由…

    2025年7月27日
    0
  • vscode一键配置C/C++多个C及CPP文件编译与tasks.json和launch.json原理

    vscode一键配置C/C++多个C及CPP文件编译与tasks.json和launch.json原理vscode配置环境及配置原理搜了很多的教程,发现要么教程太老,给的配置信息里面有些参数都不能使用了,要么就是直接扔下自己的配置信息就没了,不知道咋来的,也不能拿过来直接用,让我这种小白无从下手,于是就摸索整理一下,帮助一下像我这样小白刚入手的小伙伴们。原理我觉得最重要的就是我们要明白各个配置文件是干嘛的,它是怎么被vscode使用的,明白这一点,那么自己就可以比较清晰参数该怎么改,应该改哪些参数,而不是拿着别人的配置文件,无从下手。配置文件基本的原理(只是原理,不是咋配置的):vscode使用的最

    2022年10月23日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号