strstr的使用
- char * strstr (const char * str1,const char * str2);
- 返回str2在str1中第一次出现的位置,没有出现的话返回空指针。
- 字符串比较匹配不包含\0字符,以\0作为结束标志
strstr模拟实现
- 我们需要一个指针变量,记录起始位置和结束位置,否则无法知道从哪开始匹配成功的
- 还需要两个指针变量,记录起始位置。因为在匹配的过程中位置会发生变化
- 指针cur存放的是当前匹配的起始位置,判断起始位置是否为/0后进入while循环,进入while循环后,将其起始位置赋给s1,将字符串2赋给s2去匹配,如果s1=s2就++,继续匹配下一个地址的内容,如果匹配不成功,则跳出while循环。跳出while循环后,cur++使得起始位置+1,继续重新匹配
- 但是同时s1和s2不能等于='\0',因为如果是最后匹配成功了,但是因为没有前面的条件无法跳出循环。所以设置该条件是为了使得s1和s2还有继续匹配的寄回
- 如果匹配到s2='\0',那就说明找到了,返回cur起始位置
- 如果匹配到起始位置cur都为0了,也就是跳出循环了,那说明匹配完了,找不到了
- 特殊场景:如果str2为空,则直接返回str1
- 最后返回类型需要强制类型转换为(char * ),因为该类型是const char *,需要将其转换为const char *
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
char* my_strstr(char* str1, char* str2)
{
const char * s1 = NULL;
const char * s2 = NULL;
const char * cur = str1;
while (*cur)
{
s1 = cur;
s2 = str2;
while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return (char *)cur;
}
cur++;
}
return NULL;
}
int main()
{
char arr1[] = "abcqqqcp";
char arr2[] = "qqc";
char *ret = my_strstr(arr1, arr2);
if (ret == NULL)
{
printf("没有找到");
}
else
{
printf("%s\n", ret);
}
return 0;
}