模拟实现strstr函数

来源:互联网 发布:中国网络暴力现状 编辑:程序博客网 时间:2024/05/16 02:28

模拟实现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不动,两个再次进行比较。重复这个过程,直到两个字符串其中一个或者是两个都遇到‘\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;}


测试得到的结果如下所示:



有什么不足还请指出以便改正。



1 0
原创粉丝点击