strstr函数的作用是找到一个字符串在另一个字符串中的位置(如果有的话)。在这里介绍对于strstr函数的模拟实现。
思路:在两字符串的两指针指向字符不相等时,较长数组的指针向后移动一位,当终于移动到字符相匹配时,要留下两个指针标记地点,另外的两个指针向后移动,在一个while循环中(while(s1&&s2&&(*s1==s2)))向后同步移动并不断比较(这个地点有可能就是我要找的地址,而且,即使不是,那也要回到开始的位置重新寻找,值得注意的是,较短的数组回到开头寻找即可,但较长的数组已经可以证明刚才的字符是无效的,所以要从刚才的下一位开始寻找,具体实现方式是在下一次循环开始时,即放出去寻找的两个指针回来之前,把标记较长数组开始位置的指针向后移动一位)
#include<stdio.h>
#include<assert.h>
#include<stdio.h>
#include<assert.h>
char* my_strstr(const char* str1, const char* str2)
{
assert(str1 && str2);
const char* s2 = NULL;//对于arr2而言,由于每次寻找到一半发现失败时,都要返回其数组的头指针重新寻找,因此,arr2的头指针不能改变(因为要一直用)
//为实现这一点,需要在程序开始运行时先对数组首元素地址的指针做一份拷贝,在寻找过程中,更改这份拷贝,这样在我需要数组首元素的地址时,可以随时
//获得。相比之下,对于数组arr1而言,每次寻找失败后只需要回到上一次寻找开始节点的下一节点即可,因此不需要对其数组首元素地址做拷贝
char* cp = str1;//将指针str1的地址赋给字符型指针cp。
if (*str2 == '\0')//str2是指向所要寻找的目标字符串,即下面的bbc,当这个指针指向了\0时,说明指针已经遍历了一遍所要寻找的字符串,亦即这个字符串中的每一个元素都与上面的某一个元素相对应,此时找到了。
{
return (char*)str1;
}
while (*cp)//对于指针cp和指针s1,二者在最开始都是指向arr1字符串的首元素,但在指针遍历字符串中的每一个元素,以比较上下两个字符串的元素是否相等时,
//是指针cp在不断移动,而s1保持不动,作为一个存储此时刻出发地址的作用,只有当cp向后走,发现不满足条件时,才会将其地址赋给s1
{
str1 = cp;
s2 = str2;
while (str1 && s2 && (*str1 == *s2))//括号内的三个条件都满足时,即s1,s2指针均非空且指向的字符串相同,这是指针s1,s2可以同步向后移动,如果一直
//移动到arr2的最末端(当然也可能是arr1,arr2同时走到最末端),说明在arr1中找到了一个和arr2完全相同的字符组合,否则的话,即当还没走到arr2
//数组中的最后一个就发现了不匹配的字符,那当前情况下的初始节点就是无效的,应该从arr1中当前的开始节点的下一位开始下一轮寻找
{
str1++;
s2++;
}
if (*s2 == '\0')
{
return (char*)cp;
}
cp++;//每一次两个数组中对应的字符不同,arr1中的指针都向后移动一位,然后再次比较
}
return NULL;
}
int main()
{
char arr1[] = "abbbcdef";
char arr2[] = "cde";
char* ret = my_strstr(arr1, arr2);
if (ret == NULL)
{
printf("没找到\n");
}
else
{
printf("找到了:%s\n", ret);
}
return 0;
}