先说一下strstr函数吧。

strstr是查找字符串函数,下面是它的格式:

strstr函数的模拟实现_#define

先上主函数部分

int main()
{
char* p1 = "abbbcdf";
char* p2 = "bbc";
char* ret = my_strstr(p1, p2);//my_strstr
if (ret == NULL)//遍历p1后都没有找到p2
{
printf("未找到字串\n");
}
else
{
printf("%s\n", ret);
}
return 0;
}

然后是my_strstr的函数实现

char* my_strstr(const char* str1, const char* str2)
{
//使用assert(断言)函数,保证指针的有效性-assert(p!=NULL)
assert(str1);
assert(str2);
char* s1 = (char*)str1;
char* s2 = (char*)str2;
char* pc = (char*)str1;
while (*pc)//使用pc指针对str1所指向的字符串进行遍历
{
if (*str2 == '\0')
{
return (char*)str1;
}
while (*s1 && *s2 && (*s1 == *s2))
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return pc;
}
pc++;
s2 = (char*)str2;
s1 = pc;
}
return NULL;
}

然后画图讲解一下

strstr函数的模拟实现_#include_02

整体代码如下

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <assert.h>
char* my_strstr(const char* str1, const char* str2)
{
assert(str1);
assert(str2);
char* s1 = (char*)str1;
char* s2 = (char*)str2;
char* pc = (char*)str1;
while (*pc)
{
if (*str2 == '\0')
{
return (char*)str1;
}
while (*s1 && *s2 && (*s1 == *s2))
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return pc;
}
pc++;
s2 = (char*)str2;
s1 = pc;
}
return NULL;
}
int main()
{
char* p1 = "ab43464";
char* p2 = "b43";
char* ret = my_strstr(p1, p2);
if (ret == NULL)
{
printf("未找到字串\n");
}
else
{
printf("%s\n", ret);
}
return 0;
}