一、函数的介绍
函数头文件:#include <string.h>
函数声明:char *strstr(const char *p1, const char *p2)
函数定义:用于找到子串(p2)在一个字符串(p1)中第一次出现的位置(不包括str2的串结束符),并返回该位置的指针,如果找不到,返回空指针(NULL)。
二、函数的用法
函数的基本用法
#include <stdio.h>
#include <string.h>
int main()
{
char* p1 = "abcdef";
char* p2 = "def";
char* ret=strstr(p1, p2);
if (ret == NULL)
{
printf("无子串\n");
}
else
{
printf("有子串为:%s\n",ret);
}
return 0;
}
三、函数的讲解
1.新建s1和s2两个指针分别承接p1和p2两个指针,再建一个cur指针来保存与字符串2比较时,字符串1的首地址。
2.将cur赋值给s1,s1和s2比较,不相等,则s1++;
3.当s1和s2相等时,s1++,s2++,若后面的s1不等于s2,则cur++;
4.再重新将cur指针的值赋值给s1,p2指针的值赋值给s2,重复上面步骤,当s2==‘\0’时跳出循环。返回cur的位置
四、模拟实现函数
#include <stdio.h>
#include <string.h>
#include <assert.h> //断言头文件
char* my_strstr(const char* p1, const char* p2)
{
assert(p1 != NULL); //断言指针p1和p2,判断是否为空指针
assert(p2 != NULL);
char* s1 = p1;
char* s2 = p2;
char* cur = p1; // cur 记录字符串1出现与字符串2相等时的首地址
if ((*p2) == '\0') //判断p2是否为空串
{
return p1;
}
while (*cur)
{
s1 = cur;
s2 = p2;
while ((s2 != '\0' )&&(*s1 != '\0') &&(*s1 == *s2))
{
s1++;
s2++;
}
if (*s2 == '\0') // 当*s2等于\0时说明字符串2已比较完,找到子串
{
return cur; //返回字符串1,cur的首地址
}
cur++;
}
return NULL; //找不到子串
}
int main()
{
char* p1 = "abbbcdef";
char* p2 = "bbc";
char* ret=my_strstr(p1, p2);
if (ret == NULL)
{
printf("无子串\n");
}
else
{
printf("有子串为:%s\n",ret);
}
return 0;
}