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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • enableEventValidation是干什么的?

    enableEventValidation是干什么的?回发或回调参数无效。在配置中使用<pagesenableEventValidation=”true”/>或在页面中使用<%@PageEnableEventValidation=”true”%>启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用ClientScriptMana…

    2022年7月26日
    6
  • C语言中void代表什么意思?

    C语言中void代表什么意思?一、理解voidvoid代表空,放在返回值位置上,说明此函数执行完不返回任何值;放在参数位置上则显示说明无形式参数。二、1.放在返回值的位置上voidswap(inta,intb){intc;c=a;a=b;b=c;}该函数表示把a和b的数值进行交换即可,不需要返回值,所以用void。2.放在参数位置上#include<stdio.h>intfun(void){ return1; }int

    2022年5月19日
    70
  • RT论坛_Thread

    RT论坛_Threadfinsh是RT-Thread的命令行外壳(shell),提供一套供用户在命令行的操作接口,主要用于调试或查看系统信息。

    2025年7月26日
    2
  • 通常每个套接字地址只允许使用一次_max无法写入配置文件

    通常每个套接字地址只允许使用一次_max无法写入配置文件写入配置文件 CString IP, Port; UpdateData(TRUE); // 将应用程序控件上面的IP和端口 更新至对应的成员变量 IP = m_IpAddress.GetString(); // 读取成员变量控件上面的IP地址将赋给strIP变量 Port.Format(L”%d”, m_iPort); // 读取成员变量控件上面的端口将赋给m_iPort变量 Wri…

    2022年8月18日
    10
  • 第四章 软件项目进度管理

    第四章 软件项目进度管理本章内容提要第一节软件项目进度管理概述l进l进度是对执行的活动和里程碑所制定的工作计划日期表。l项目进度管理也被称作项目时间管理、工期管理,是指在项目实施过程中,对各阶段的工作进展程度和项目最终完成的期限所进行的管理,是为了确保项目按期完成所需要的管理过程。l项目进度管理是保证项目如期完成及合理安排资源供应,节约工程成本的重要措施之一。度是对执行的活动和里程碑所制定的工作计划日期表。l项目进度管…

    2022年5月20日
    38
  • rammap使用_查看内存的命令

    rammap使用_查看内存的命令参考TechnetProcessPrivate:分配给单一Process专用的内存MappedFile:用来储放档案内容快取(Cache)的内存空间SharedMemory:标注给多个Process共用的内存分页(Page,内存管理单位)PageTable:用来描述虚拟内存位址的分页表(裡面是一笔一笔的PTE,PageTableEntries)PagedPool…

    2025年8月10日
    4

发表回复

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

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