本人没参考任何strstr函数的标准源码,自己摸索了一天不断调试,不断修改按自己的逻辑才写出这个字符串查找函数的算法,查找字符串不像一般的字符串复制和连接,情况更复杂,每一种情况都要能查出来,差点就放弃了
strstr函数的功能是字符串查找:
代码:
#include<stdio.h>
#include<string.h>
char* my_strstr(const char* str1, const char* str2)
{
char* s1 = NULL;
char* s2 = (char*)str2; //把str2的首地址保存下来
while (*str1 && *str2) //其中任何一个字符串找到最后遇到'\0',或者传进来的是空字符串就结束寻找
{
while (*str1 && *str2 && (*str1 - *str2)) //str1的每个字符都和str2的首字符比较一轮
str1++; //如果两个字符不相同,就让str1自加,直到出现相同的字符为止
s1 = (char*)str1;//出现了相同的字符后,就记录下这个字符的地址
while (*str1 && *str2 && !(*str1 - *str2)) //如果相同就继续往后找,遇到'\0'就停止,或者还没遇到'\0'但是两者不相同也停止
{
str1++; //相同就接着往后找
str2++; //相同就接着往后找
}
if (*str2 && *str1) //任何一个字符串找到最后就不要重新比较了,最大的while循环也会退出来
{
str1 = s1 + 1; //防止一个字符出现多次,所以让s1往前加一,再和str2重新作比较
str2 = s2; //此时str2也要重新指向首字符
}
}
if (!*str2)
return (char*)s1;
return NULL;
}
int main()
{
char* str1="aabbbbbbbaaabbca";
char* str2="bbc";
char *p1=NULL;
char *p2=NULL;
p1=my_strstr(str1,str2);
p2=strstr(str1,str2);
printf("%s\n",p1);
printf("%s\n",p2);
system("pause");
return 0;
}
最难处理的是这两种情况:
char str1=“abbbcdef”
char str2="bcd"
\**************************************************************************\
char str1=“abbbcaefbcdf”
char str2= “bcd”**
都是从 str1 里找 str2
要处理上面两种情况,无非就是从str1的首字符和str2的首字符比较一下,如果两个字符不相同,就让str1往后偏移一个字符,继续和str2比较,直到出现相同的字符,用s1记录下这个字符的地址。此时出现了相同的字符,那么就让两个指针都往后偏移一个字符接着比较,不断循环,直到不相同为止。此时又分两种情况,第一种是str2还没遇到 ‘\0’,那么就必须重新让str2指向首字符,让str1指向s1+1这字符,然后又接着和str2比较,过程一样,因为你不知道你后面还有没有你要找的那个字符串,所以还得接着找。第二种情况是str2刚好指向了 ‘\0’,那么这个时候就没必要在找下去了,直接退出大循环。
以上是大致的一个过程,关键还是找字符的思路要清晰,不然就算你语言学的再好,没有算法和思路一样不知道怎么去动手写代码,如果发现结果和自己想的不一样,一定要不断调试找原因,然后不断改进循环的条件,充分考虑所有的情况。算法可以不是最好的,但是功能一定要实现到位