每天深解一个字符串类函数之strstr函数

目录

前言:

一、引用头文件

二、strstr函数的作用

三、理解strstr函数的定义

1、返回类型

2、参数 

四、使用strstr函数

1、编写程序

2、调试运行

五、注意要点 

六、模拟实现


前言:

每天深入了解一个字符串类函数,今天我们要学习的是strstr函数,相信你学玩之后会对字符串类函数有更深的了解,坚持下去你又将超过百分之九十九的人。

一、引用头文件

C语言:

#include <string.h>

C++:

#include <cstring>

二、strstr函数的作用

strstr函数是用于判断一个字符串内部是否包含另一个字符串。('\0'不计算于内

(具体的在定义处讲解)

三、理解strstr函数的定义

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

1、返回类型

C语言标准规定:库函数strstr的返回类型为一个char*的指针。

当str1指针指向的字符串包含str2指针指向的字符串时,返回str1指针指向的字符串中str2指向的字符串的起始位地址。

例如:abcdef字符串中包含cde字符串用该函数会返回abcdef字符串中c的地址。

当str1指针指向的字符串不包含str2指针指向的字符串,返回一个空指针即NULL。

2、参数 

C语言标准规定:strstr函数的参数有两个,一个为const char* str1(一个字符指针,前用const修饰使其不能通过指针更改其指向的字符串用于表示要判断是否包含另一个字符串的字符串(可形象理解为长字符串,“长”不含绝对意义);另一个为const char* str2用于表示是否被包含的字符串(可形象理解为短字符串,“短”亦无绝对意义)。

四、使用strstr函数

1、编写程序

#include <string.h>
#include <stdio.h>
int main()
{
	char arr1[] = "abbbcdef";
	char arr2[] = "bbc";
	char* ret = strstr(arr1, arr2);
	if (ret == NULL)
	{
		printf("没找到!\n");
	}
	else
	{
		printf("找到了:%s\n",ret);
	}
	return 0;
}

2、调试运行

五、注意要点 

全程无坑,请放心使用。(若有问题可在评论区补充)

六、模拟实现

#include <stdio.h>
#include <assert.h>
char* my_strstr(const char* str1,const char* str2)
{
	assert(str1 && str2);
	const char* s1 = NULL;
	const char* s2 = NULL;
	const char* cp = str1;//代每次比较首字符地址
	if (*str2 == '\0')//当str2为空字符串直接返回str1表示起始位置地址
	{
		return (char*)str1;
	}
	while (*cp)
	{
		s1 = cp;//代str1当前比较字符地址
		s2 = str2;//代str2当前比较字符地址
		while (*s1 == *s2)
		{
			
			s1++;
			s2++;
			if (*s2 == '\0')
			{
				return (char*)cp;
			}
		}
		
		cp++;
	}
	return NULL;
}
int main()
{
	char arr1[] = "abbbcdef";
	char arr2[] = "bbc";
	char* ret = my_strstr(arr1, arr2);
	if (ret == NULL)
	{
		printf("没找到!\n");
	}
	else
	{
		printf("找到了:%s\n",ret);
	}
	return 0;
}

*其中重点循环位置的梳理

while (*s1 == *s2)
{
			
	s1++;
	s2++;
	if (*s2 == '\0')
	{
		return (char*)cp;
	}
}

当s1位置为'\0',s2位置不为'\0',循环结束;当s1位置不为'\0',s2位置为'\0',因其先加后判会满足if条件结束程序;当s1与s2都为'\0'也会因为满足if条件结束程序。

每日一学,今天你又超过了百分之九十九的人。

如果本篇文章对你有帮助,请点个关注和赞吧!

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值