今天来介绍一个函数strstr。
首先我们来了解一下strstr的作用:是用来判断你需要查找的字符串在原来字符串中有没有,如果有,则输出这个字符串的尾数,没有的话就,输出空。
举个例子,比如说有两个字符串,str1[] = “abcdef”; str2[] = “def”;你可以通过strstr函数查找str1在str2中的位置得到“cdef”。
那么这个函数的具体工作原理是怎么样的呢,接下来我们就具体来模拟实现一下这个函数。
首先我们要确定思路,我们可以很清楚的知道,我们需要操作的是两个字符串,那么我们需要传给函数的参数也就是两个,而且我们拿来比较和被比较的两个字符串都是不希望被更改的,最后我们需要得到的是源字符串在目标字符串中的位置,也就是说返回值是一个字符串。那么我们可以确定函数原型为:char* my_strstr(const char* dest,const char* src)
然后我们给两个字符串str1:abcdef,str2:edf,接下来我们建立两个指针char* com = str1; char* subcom= str2;这样子现在的com指向a,subcom指向的是b,对这两个指针进行比较并解引用,然后判断是否相等,若相等则两个指针都向后移动,若不相等,com向后移动,subcom不动,再次进行解引用并判断是否相等,直到两个中的一个遇到‘\0’,则遍历结束,这种方法可以采用循环的方法来做,循环的判断条件是(com !='\0'&&*com == *sumcom)。
此时你如果觉得这样就可以实现这个函数的话那你就会进入一个误区,当遇到下面这种情况时你的程序会出错,比如这两个字符串进行比较时使用上面的这种方法的时候就会出错,当str1:abbbbbcd,str2:bbcc的时候,开始时两个指针com从a开始移动,sub从b开始移动,当com指向str1的第一个b时,subcom指向str2的第二个b,然后当继续往后走的时候,subcom指向的是c,com指向b,此时解引用进行判断发现不相等,此时subcom会返回指向str2的第一个b而com没动,这是再采用上面的方法去做比较就会发现你再也找不到和com相等的字符串,显然这不是我们想要的结果。那么怎么解决这个问题呢,我们知道subcom这个指针在和com比较的时候如果不相等的时候会返回起始位置,而com是没有任何变动的,那么我们现在让当subcom和com比较时发现不想的的时候为我们让subcom返回起始位置的下一个位置,同时我们需要创建一个rem指针来记录起始位置,那么这个问题就可以得到解决。
具体操作如下:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
char* my_strstr(const char* dest,const char* src)
{
char* com = (char*) dest;
char* subcom = (char*) src;
char* rem = (char*) dest;
assert(dest != NULL);
assert(src != NULL);
while(*rem)
{
com = *rem;
while(*com !='\0'&&*com == *subcom)
{
com++;
subcom++;
}
if(*subcom =='\0')
{
return rem;
}
subcom = (char*)src;
rem++;
}
return NULL;
}
int main()
{
char a[20] = "abbbcdef";
char b[20] = "bbcd";
printf("%s\n",my_strstr(a,b));
return 0;
}