字符串函数复习专栏 -----8-----strstr()

目录

前言

函数简单介绍

引言

用法

 简单实现(非KMP版)

代码处

其他

小歪例

库文件

C++Refence

完 !!!


前言

再弄strstr时就突然想弄一个字符串函数专栏,及对自己知识的巩固,也让将来复习时方便一些,并且发到网上,也希望大佬可以指点指点,非常欢迎大家提出建议与问题。

这个顺序还是有的,但是得慢慢补,毕竟想法来的突然了一些。

函数简单介绍

引言

strstr----查找子串函数,即你有两个字符串,一个为father[] = "abcdef",一个名为son[] = "cde",你想知道或者就是有人让你用程序告诉他son是否被包含在father中,即son是否是father的一个子字符串,那么你就可以运用这个函数去简简单单的完成这件事情。(虽然很容易就看出来了,但你最好装作没看出来哦)

用法

在C中   char * strstr ( const char *str1, const char *str2 ),你只需要将str1换成father,将str2换成son,可是结果是什么怎么知道呢?看看它的返回值,一个字符指针,那是指向什么的?

这个被返回的指针,如果son是father的子串,那么就会返回son在father中对应的起始位置,在此例中就是返回 指针中存放(father + 2) 对应的地址也就是在father中的d所在的地址。

#include<stdio.h>
#include<string.h>
int main()
{
	char father[] = "abcdef";
	char son[] = "cde";
	char* mid = strstr(father, son);
	if (mid == father + 2)
		printf("%s\n", mid);
	else
		printf("你骗人\n");
	return 0;
}

 可是那如果son[] = "cdf"呢,那就不好意思了,返回一个NULL空指针咯。

#include<stdio.h>
#include<string.h>
int main()
{
	char father[] = "abcdef";
	char son[] = "cdf";
	char* mid = strstr(father, son);
	if (mid == NULL)
		printf("%s\n", mid);
	else
		printf("你骗人\n");
	return 0;
}

 

 简单实现(非KMP版)

代码处

查找是否是子字符串定是要进行比较的来判断是否被包含,总体思想就是正常情况下father有多少个字符(\0当然是不算的了),就进行多少轮比较。拿出father中的一个字符作为头,开始与son中的字符进行依次比较,如果遇见不符合就跳出此次比较,开始下一轮。

详情请见下面:(若有不懂之处,可以尝试耐心看完代码或许感觉会好一点)

char* my_strstr(const char* fher, const char* son)
{
	assert(fher);
	assert(son);
	//从父字符串第一个字符开始,每一个字符串进行一轮查找
	char* f1 = (char*)fher;//每一轮查找时用这个临时指针进行移动
	char* s1 = (char*)son;//每一轮查找结束后,如果这轮未找到
	//那么在进行下一轮时son肯定要归到起始位置,所以临时拷贝,让s1去移动,son中存储着起始地址
	while (*son)//子字符串为空字符串查找也没意义了
	{
		while ((*s1) && (*f1) && (*f1 == *s1))
		{
			//s1此时不指向\0,f1此时不指向\0,且f1与s1所指向的字符一样才会进来
			f1++;
			s1++;
		}

		if (!*s1)//脱离前面的循环时的一种情况,就是*s1为\0,也就意味着\0之前的字符比较后是相同的,的一直比到了\0
			return fher;
		if (!*fher)//这种情况就是进行到了头仍未找到字串
			return NULL;
		f1 = ++(char*)fher;//开始下一轮比较的起始地址的赋值
		s1 = (char*)son;//子串也得回到头重头开始新一轮比较
	}
	return fher;
}

int main()
{
	char arr1[] = "abbbcdefge";
	char arr2[] = "bbc";
	//char* str = strstr(arr1, arr2);
	char* str = my_strstr(arr1, arr2);
	if (!str)
	{
		printf("没有找到\n");
	}
	else
	{
		printf("%s", str);
	}
	return 0;
}

其他

小歪例

感觉代码中的例子比较好,程序员还要是有一些发散性思维的。

库文件

这个可以自己去在本地文件去搜索看一下,有点太长了,我就不拿来凑字数了。

C++Refence

完 !!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值