模拟实现strstr函数
首先,你需要了解strstr函数的作用是什么:strstr函数就是为了判断你需要查找的字符串在原来的字符串中有没有,如果有,输出这个字符串的位置,没有,输出空。
举个例子吧:给上两个字符数组:str1[20]="abcdefg",str2[10]="bcd";通过使用strstr函数可以得到”bcdefg“,输出的是你需要查找的字符串的位置。
接着,我们来具体讲一下实现这个函数的方法吧;
首先,根据strstr函数的实现方法得知函数需要传进去的参数是两个字符串,而且这两个字符串都是不可更改的,这样,我们可以利用const来修饰;而且函数返回的也是一个字符串,那么返回值类型也可以确定,这样,我们可以写出这样一个函数的定义:char* my_strstr(const char* dest,const char* src){}。其中,dest指向的是目标字符串,也就是你需要比较的字符串,src指向的是源字符串,也就是用来被比较的字符串。找不到就可以返回一个空指针。
实现的思路也是比较简单的,你可以建立两个指针,通过遍历的方式逐个访问字符串,并对这两个指针一一比较。
举例说明:给上俩个字符串:
str1:abcdefg
str2:bcd
建立两个指针:char *start=str1; char *substart=str2;
此时,start指向字符a,而substart指向字符b,对start和substart两个指针解引用并进行比较,判断是否相等,即*start=*substart;若是两个相等,则两个指针都向后移动一位,再解引用进行判断;若是两个不相等,那么start向后移动一位,substart则将会重新指向str2的起始位置,两个再次进行比较。重复这个过程,直到两个字符串其中一个或者是两个都遇到‘\0’,遍历结束。那么在这里你就可以采用循环的方法来做;循环的判断条件就是(start!='\0' && substart!='\0' && *start==*substart)。
如果到这里你觉得这个函数就算实现成功的话,那你可就掉到坑里去了。我再举个例子吧:
str1:abbbcdefg
str2:bbcd
这里你继续采用上面的方式做,你会得到不一样的结果。
指针判断,当start指向str1中的第一个b时,substart指向str2中的第一个b,两个相等,再往后面遍历,当start指向第三个b的时候,substart指向c,两个不相等,那么此时substart会返回并指向str2中的第一个b。
注意,此时start指向的还是str1中的第三个b,start并没有发生移动,再采用如上的方式比较,从str1的第三个b开始,你再也找不到与str2相同的,那么函数会返回一个 空,可是显然第一个字符串中包含你需要的查找的字符串。这样,我们就需要通过某种方法来解决这个问题。
解决方法其实也是比较简单的:当两个字符串比较的结果不相等时,我们知道substart,就是指向第二个字符串的指针是返回到str2这个字符串的起始位置的,而start这个指针并没有发生任何的变动。再次比较也只能从这个位置继续向后比较,那么中间肯定就会有一些字符是没有办法比较的。所以,当两个字符比较不相等时,start这个指针也需要向前返回,不过它回到的不是起始位置了,而是起始位置的下一个位置,这样就可以避免重复而无用的比较。所以,我们需要在创建一个指针cp用来保存起始位置,并让start返回到起始位置的下一个位置。
具体的代码实现方法如下:
</pre><pre name="code" class="cpp">#define _CRT_SECURE_NO_WARINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
char* my_strstr(const char* dest, const char* src)
{
char* start = (char*)dest;//在这里需要强制类型转换成char*
char* substart = (char*)src;
char* cp = (char*)dest;//cp就是用来保存首地址的
assert(dest != NULL);
assert(src != NULL);
while (*cp)
{
start = cp;
while (*start != '\0' && *substart !='\0' && *start == *substart)
{
start++;
substart++;
}
if (*substart == '\0')
{
return cp;
}
substart = (char*)src;
cp++;//cp++可以得到原起始位置的下一个位置
}
return NULL;
}
下面则是测试函数:
int main()
{
char a[20] = "abbbcdef";
char b[10] = "bbcde";
printf("%s\n", my_strstr(a, b));
system("pause");
return 0;
}
测试得到的结果如下所示:
有什么不足还请指出以便改正。