我的代码:
#include <stdio.h>
char* my_strstr(const char* p1, const char* p2);
int main()
{
char a[20] = {'\0'};
gets_s(a);
char b[20] = {'\0'};
gets_s(b);
printf("%s",my_strstr(a, b));
return 0;
}
char* my_strstr(const char* p1, const char* p2)
{
char* s1 = (char*)p1;
char* s2 = (char*)p2;
char* po = (char*)p1;
while (*s1 != '\0')
{
po = s1;
s2 = (char*)p2;
while (*po == *s2 && *s2 != '\0')
{
++po;
++s2;
}
if (*s2 == '\0')
{
return s1;
}
++s1;
}
return NULL;
}
指针po的注释:
/*
指针po是为指针s1探路的,相当于s1替身。
每当发现(p1所指向的字符 == p2所指向的字符串的首字符)时,
po就代替s1开始先后走,此时有两种可能的结果:
1)po走到某位置,发现与s2所指字符不相等了,此时s1++,po返回s1位置。
2)po走完与s2匹配的全过程。
设置po指针是考虑到有这种情况:
字符串A:"AAB"
字符串B:"AB"
试想,若无po指针,s1指针指向第一个'A'时,匹配开始,s1自己向后走,
当匹配到第二个'A',匹配失败,这时难道就认为没有不存在子串吗?
当然不可能,因为我们显然可以看到若从第二个'A'开始匹配就可以找到"AB"子串。
但这时s1已经不可能找回去往第二个'A'的路了(因为实际情况中我们不知道匹配到哪里会出错)。
po这个探路者的角色由此可见一斑。
*/
strstr()函数源码?
#include <stdio.h>
?
char * __cdecl strstr(const char *str1, const char *str2)
{
char *cp = (char *)str1;
char *s1, *s2;
?
if (!*str2)
return((char *)str1);
?
while (*cp)
{
s1 = cp;
s2 = (char *)str2;
?
while (*s2 && !(*s1 - *s2))
s1++, s2++;
?
if (!*s2)
return(cp);
?
cp++;
}
?
return(NULL);
}
|