开门见山的说:
strstr函数需要调用库函数 #include<string.h>
strstr函数的形参变量
char * strstr ( const char *str1, const char * str2)
这个函数的作用就是在str1中判断str2是不是str1的子串
这个函数的返回值是char*
如果是的那么该函数返回从子串开始的地址
koss与ss返回第一个s开始的地址。
如果不是的那么该函数返回空指针
模拟实现逻辑
char* s1 = p1;//代替p1进行匹配
char* s2 = p2;//代替p2进行匹配
char* so=p1;
while (*so)
{s1 = so;//匹配重置。
s2 = p2;
while (*s1!='\0'&&*s2!='\0'&& * s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return so;
}
so++;
}
将在这个函数中使用s1和s2进行比较,so指针进行缓冲。
如果*s1!=*s2,那么so将++跳过,s1重新从下一个开始对比。
只要s2没有比到 \0,那么so就会++跳过一个字符。
并将s1重置为跳过一个字节的so ;*s1就会重新从跳过一个字节的so位置开始比对。
代码整体:
#include<stdio.h>
#include<assert.h>
char* my_strstr(const char* p1,const char* p2)
{
assert(p1 && p2);
char* s1 = p1;//代替p1进行匹配
char* s2 = p2;//代替p2进行匹配
char* so=p1;
while (*so)
{
s1 = so;//匹配重置。
s2 = p2;
while (*s1!='\0'&&*s2!='\0'&& * s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return so;
}
so++;
}
return NULL;
}
int main()
{
char arr1[20] = { "koabcd" };
char arr2[] = { "abcd" };
char* k =my_strstr(arr1, arr2);
if (k == NULL)
{
printf("arr2不是arr1子串\n");
}
else
{
printf("%s\n", k);
}
return 0;
}