admin管理员组

文章数量:1794759

字符串函数(5)strstr函数的使用和模拟实现

这两天军训,真是累死了。两天没写博客了,今天更新一篇字符串函数,这个strstr函数比前几个字符串函数难一点,我尽量写详细一点。

strstr函数

strstr函数的功能

Returns a pointer to the first occurrence of str2 in str1, or a null pointer if str2 is not part of str1. The matching process does not include the terminating null-characters, but it stops there. strstr函数的格式 char * strstr ( const char *, const char * ); 写个代码看看吧

代码语言:javascript代码运行次数:0运行复制
#include <stdio.h>
#include <string.h>
int main()
{
	char ch1[] = "i am student good student";
	char ch2[] = "student";
	char* ret = strstr(ch1, ch2);
	if (ret != NULL)
		printf("%s\n", ret);
	else
		printf("找不到");
	return 0;
}

这个代码很简单就不多解释了。下面开始讲strstr函数的模拟实现。

strstr函数的模拟实现

所有的解释都放在代码里面啦,大家要认真看哦,我很认真找写欸。 不知道assert(断言)const(常量)的就看往期的字符串博客咯。

代码语言:javascript代码运行次数:0运行复制
#include <stdio.h>
#include <assert.h>
char* my_strstr(const char* str1, const char* str2)
{
	assert(*str1 && *str2);
	char* s1 = NULL;//si,s2的作用主要是代替str1和str2前进。使用了s1和s2就可以不改变str1和str2指向的东西,每一次循环重新将str1和str2赋给s1和s2就可以了。
	char* s2 = NULL;
	char* cp = str1;
	if (*str2 == '\0')//如果子字符串的为斜杠0,直接返回str1,规则是这样的。
		return str1;
	while (*cp)//用两个循环嵌套,第一个循环
	{
		s1 = cp;//cp的作用是记忆str1的位置,如果目的字符串为"abbbcd"子字符串为"bbc"记忆就显得极为重要了。当目的字符串中的bb对应子字符串中的bb,可是一旦再次加一,两个
		//字符串将不在相等,跳出第二个循环,此时cp++,再次回到一个循环,就可以完美打印出bbcd啦,其实可以给你们画图片的解释的,但是我相信大家都是很聪明的人,才不是我懒呢。
		s2 = str2;
		while (*s1 == *s2 && *s1 && *s2)//因为&&和数学上的且相似,*s1或*s2一但指向0就直接可以跳出循环了,这样写就比*s1!='\0'&&*s2!='\0'方便多了。
		{
			s1++;
			s2++;

		}
		if (*s2=='\0')//当*s2指向'\0'就证明s2走完了,可以直接返回cp了。
			return cp;
		cp++;

	}
	return NULL;//如果走上面的过程还是没有找到,就证明找不到了,直接返回空就是啦。
}
int main()
{
	char ch1[] = "i am a student good student";
	char ch2[] = "student";
	char* ret = my_strstr(ch1, ch2);
	if (ret != NULL)
		printf("%s\n", ret);
	else
		printf("找不到");
	return 0;
}

我是结衣,大一在读,如果发现错误就在评论区告诉我吧。期待你的关注哦。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2023-09-16,如有侵权请联系 cloudcommunity@tencent 删除字符串char博客函数数学

本文标签: 字符串函数(5)strstr函数的使用和模拟实现