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 != '
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;
}
' && *s2 != '
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;
}
') { s1++; s2++; } if (*s2 == '
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;
}
') { 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 != '
#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;
}
' && *s2 != '
#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;
}
') { s1++; s2++; } if (*s2 == '
#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;
}
') { 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函数怎么写

 

结束

 

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • webApp开发心得「建议收藏」

    webApp开发心得「建议收藏」从事单页相关的开发一年有余,期间无比的推崇webapp的网站模式,也整理了很多移动开发的知识点,但是现在回过头来看,webapp究竟是好还是不好真是一言难尽哟!webapp使用JavaScript修改页面;紧接着再从服务器传递更多数据然后再修改页面,如此循环。从性能的角度看,在现代浏览器中单页面WebApp已经能够和普通native应用程序相媲美,而且几乎所有的操作系统都支持现代的浏览器…

  • webview长按复制_安卓手机怎么复制图片上的文字

    webview长按复制_安卓手机怎么复制图片上的文字有这么一个需求,用户在浏览文本信息时希望长按信息就能弹出复制的选项方便保存或者在别的页面使用这些信息。类似的,就像长按WebView或者EditText的内容就自动弹出复制选项。这里面主要是2个特点:1、用户只能浏览文本信息而不能编辑这些文本信息;2、用户对着文本信息长时间点按可以弹出”复制”选项实现复制;网上有好多种方法可实现,也比较零散,此处做个小结,希望有所帮助。1、通过继承EditTe…

  • vpp命令总结_gdb调试命令总结

    vpp命令总结_gdb调试命令总结createsubBondEthernet0834创建子接口,tag是834setinterfaceiptableBondEthernet0.8341将此接口设置在fib1里setinterfaceipaddressBondEthernet0.834192.168.0.250/24设置接口ipsetinterfaces

    2022年10月25日
  • processon激活成功教程版_杭州小木吉软件科技有限公司

    processon激活成功教程版_杭州小木吉软件科技有限公司processon.com-在线团队协作软件今天学到一个在线团队协作软件:www.processon.com免费在线作图,实时协作ProcessOn支持以下等等协同作业场景:流程图、思维导图、原型图、UML、网络拓扑图、组织结构图等等另外支持模板(可选)。以上就是关于“processon.com-在线团队协作软件(草巾冒小子)推荐”的全部内容。…

    2022年10月19日
  • JAVASCRIPT 上传文件的几种方式「建议收藏」

    JAVASCRIPT 上传文件的几种方式「建议收藏」方法1:使用ajax,通过formdata传参//注意:FormData只兼容到IE10varformData=newFormData();varfile=$(‘.import-file-btn’).get(0).files[0];formData.append(‘file’,file);formData.append(‘id’,id);formData.append(‘name’,name);$.ajax({url:’user/validate_impo

    2022年10月22日
  • 基于ie内核,浏览器自带flash插件「建议收藏」

    e内核自带flash方案要比webkit复杂Ie的flash插件是个ocx,也是com组件。WindowsCom组件的加载过程如下:1、通过组件的DllRegisterServer注册com组件,会在注册表生成com组件的路径,guid,progid,threadtype等等2、Client通过guid查找到注册表中com组件的地址,loadlibrary加载这个组件,调用c

发表回复

您的电子邮箱地址不会被公开。

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