前言:
这是我第一次遇到的逻辑相对来说比较绕的一个函数,希望这篇可以让我更好的去理解
代码如下:
#include <stdio.h>
#include <assert.h>
char* my_strstr(const char* s1,const char*s2)
{
assert(s1&&s2);
const char* str1 = s1;
const char* str2 = s2;
const char* cut = s1;
while (*cut)
{
str1 = cut;
str2 = s2;
while ((*str1 != '\0') && (*str2 != '\0') && (*str1 == *str2))
{
str1++;
str2++;
}
cut++;
if (*str2 == '\0')
{
return cut;
}
}
return NULL;
}
int main()
{
char* arr1 = "abcedf";
char* arr2 = "abc";
char* ret = my_strstr(arr1, arr2);
if (ret == NULL)
printf("子串不存在\n");
else
printf("yes");
return 0;
}
首先这个函数的返回值是个指针,如果arr2是arr1中的一个子串,那么返回的是子串的起始地址,反之返回空指针即--NULL。
函数的基本逻辑如下
利用循环完成
while ((*str1 != '\0') && (*str2 != '\0') && (*str1 == *str2))
{
str1++;
str2++;
}
cut++;
这个循环毋庸置疑是比较好懂的,要保证每个指针指向的字符不为\0,如果发现子串的第一个字符和母串的第一个字符相等就要去判断下一个(字母串指针各向后跳一个),如果不等,那么母串指针就向后跳一个。
if (*str2 == '\0')
{
return cut;
}
我们来看这个判断条件,循环结束后我们判断是否已经判断完子串中所有的字符,如果是的话,那么条件成立
const char* str1 = s1;
const char* str2 = s2;
const char* cut = s1;
while (*cut)
我们来看看这些代表的意思
前三个是为了在判断完后可以保留地址以便用来返回
我们来看这个循环
while (*cut)
最初是s1即母串地址,while ((*str1 != '\0') && (*str2 != '\0') && (*str1 == *str2))
{
str1++;
str2++;
}
cut++;
如果母串第一个字符和子串不相等则母串+1然后再次赋给str1
如果*cut为\0了,那么说明母串找完了也没有找到对应的字符,那么返回空指针