(strstr的实现)
1.介绍
const char * strstr ( const char * str1, const char * str2 );
查找子字符串 返回指向 str1 中第一次出现的 str2 的指针,如果 str2 不是 str1 的一部分,则返回空指针。
匹配过程不包括终止空字符,但它止步于此。
2.我自己写的(自己尝试的,暂时没发现bug如果有可以跟我说)
我们可以根据上面的需求写出strstr的函数 下面开始
char* my_strstr(const char* p1, const char* p2)
{
assert(p1 && p2);
const char* tmp = p2;
if (*p2 == '\0')
return p1;
while (*tmp&&*p1)//都为真才往下循环
{
if(*p1 == *tmp)//当两个字符相等时才同时相加
p1++, tmp++;
else if (*(p1 - 1) == *tmp)//有可能是我的首字母正好和他的首字母相同,但是因为p1++我指向了首字母后面一位
--p1; //所以用这个判断是否因为一个字符的大小错过,如果差一个字符下面的--p1正好前移一位
else if (*p1 != *tmp)//当两个字符不相等时,需要把tmp重新返回到初始(首字母)位置,
p1++, tmp = p2;
}
if (!*tmp)//当*tmp为'\0'时为假,但是加上!则为真,于是返回指针
return p1 - strlen(p2);//减去一个p2的长度是因为要使指针指到找到字符串的位置
else if (!*p1)//当*p1为'\0'时,因为前面判断了tmp所以如果*p1为'\0'时就是没有找到包含的字符串,返回空指针
return NULL;
}
int main()
{
const char* arr1 = "abcaabcdef";
const char* arr2 = "abcdef";
const char*p=my_strstr(arr1, arr2);
if ( p== NULL)
printf("没找到\n");
else
printf("找到了%s\n",p);
return 0;
}
3.这个是库函数(推荐)
//自己实现strstr
char* my_strstr(const char* p1, const char* p2)
{
assert(p1 && p2);
if (*p2 == '\0')
return(char*) p1;
const char* m = NULL;//设两个空指针m.n
const char* n = NULL;
const char* ret = p1;//将p1赋值给ret
while (*ret++)//每次循环ret++直到ret为'\0'时退出循环输出
{
m = p1,n = p2;//把p1赋值给m,p2赋值给n,当下方判断为假时n重新变回首字母地址
while (m && n && !( * m - *n))//如果相减为0,感叹号则为真继续执行
{
m++,n++;
if (*n == '\0')
return (char*)p1;//因为前面的p1是进行了const所以要加上char*强制转换
if (*m == '\0')//当p1字符串数量低于p2时,但是m和n相等时,在*m=='\0'时返回空指针
return NULL;
}
}
return NULL;//因为*ret=='\0'所以里面没有符合条件的字符串所以直接返回NULL
}
int main()
{
const char* arr1 = "abc";
const char* arr2 = "abcdef";
const char* p = my_strstr(arr1, arr2);
if (p == NULL)
printf("没找到了\n");
else
printf("找到了%s\n", p);
return 0;
}