判断子串在主串中位置的函数——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函数的主要内容,如果未能解决你的问题,请参考以下文章