判断子串在主串中位置的函数——strstr函数

Posted zsQgqdsd1002

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了判断子串在主串中位置的函数——strstr函数相关的知识,希望对你有一定的参考价值。

我们首先还是来看一下strstr在msdn中的定义:

char *strstr( const char *string, const char *strCharSet );

The strstr function returns a pointer to the first occurrence of strCharSet in string. The search does not include terminating null characters.

strstr函数返回字符串中第一个出现的strCharSet的指针。搜索不包括终止空字符

这里我们需要注意,定义中说的是,返回第一个出现子串的指针,也就是说,如果子串是"abc",主串是"wyjabcdyyabcqwe"的话,调用strstr函数是,返回的结果会是第一个出现"abc"的位置即"abcdyyabcqwe"而非是"abcqwe"

我们现在自己想办法来实现以下这个函数,首先我们确定一下这个函数的一个判断的逻辑,下面我用画图来简单的说明一下:
在这里插入图片描述

我们假设两个字符串分别是str1和str2,并且有两个指针分别是p1和p2分别指向他们的首字符,由于最后返回的值是一个char*类型,p1在不断的判断过程中会发生改变,如果我们返回p1的地址,那么最后得到的结果可能会与我们预期的结果有出入,所以我们再定义两个指针s1和s2分别等于p1和p2

下面我们来探究一下判断条件,即如何判断,我们首先判断*s1与*s2的值是否相等,如果相等的话就让s1++,s2++,再来判断*(s1 + 1)和 *(s2++)是否相等,以此类推,直到*s2 == ‘\\0’的时候我们知道字符串str2已经判断完毕了,也就是说我们找到了,这个地方可以用循环来判断

在这里插入图片描述
图画的有点丑陋,但是就是这么个意思,当*s2 == ‘\\0’之时就意味着找到了,这个时候我们返回p1,就可以得到想要的结果。

那么接下来我们看一下如果没找到的话会怎么样,如果没找到的话,我们就结束之前的循环,然后让p1++,并且令s1和s2都回到当前p1和p2的位置继续判断即可,直到我们的*p1 == '\\0’时就意味着,已经寻找完整个str1字符串了但是没有找到,这个图实在是画出来的惨不忍睹不堪入目,大家根据我的话来理解就可以了,下面我们来试着实现一下:

#include<stdio.h>
const char* Mystrstr(const char* p1, const char* p2)
{
	assert(p1 && p2);
	const char* s1 = p1;
	const char* s2 = p2;
	while (*s1 != '\\0')
	{
		s1 = p1;
		s2 = p2;
		while (*s1 == *s2 && *s2 != '\\0')
		{
			s1++;
			s2++;
		}
		if (*s2 == '\\0')
		{
			return p1;
		}
		p1++;
	}
	return NULL;
}

int main()
{
	const char* str1 = "wyjabcdyyabcqwe";
	const char* str2 = "abc";
	const char* ret = Mystrstr(str1, str2);
	printf("%s", ret);
	return 0;
}

我们来看一下程序的输出结果:

在这里插入图片描述

非常的完美

以上就是想今天分享给大家的,如果有什么错误的地方或者有待提高的地方,欢迎大佬联系我

以上是关于判断子串在主串中位置的函数——strstr函数的主要内容,如果未能解决你的问题,请参考以下文章

判断子串在主串中位置的函数——strstr函数

判断子串在主串中位置的函数——strstr函数

KMP小扩展,找出子串在主串中出现的所有位置

数据结构(十五)串的顺序存储结构(顺序串)

第四章学习小结

大话数据结构 串