?注释版:
//strstr 函数的模拟实现:
#include<stdio.h>
#include<assert.h>
//str1是被查找字符串,str2是目标字符串(查找模板)
char* my_strstr(const char* str1, const char* str2)
{
//利用assert进行判断,防止出现指针的非法访问
assert(str1 != NULL && str2 != NULL);
char* cur = str1;//创建的目的就是记录每次查找时的起点
char* p2 = str2;
char* p1 = str1;
//查找模板不存在,直接返回被查找字符串首地址
if (*str2 == '\0')
{
return str1;
}
while(*cur)
{
//更新str1的位置,复位str2的位置
str1 = cur;
str2 = p2;
while (*str1 != '\0' && *str2 != '\0' && *str1 == *str2)
{
if (*str2 != '\0')
//str2检索到斜杠0说明检索完成,而且经过内层循环的判断
//说明了此时str2在str1中找到了自己。
{
return cur;//返回本次字符串检索起点位置
}
}
//每次内层循环的跳出都意味着当前cur的位置无法匹配str2
//由此cur指针会向前移动一位,在下一位上继续进行配对
cur++;
}
//走到这一步,说明*cur == '\0',即检查了整个字符串str1中没有发现str2
//根据strstr的返回规则,此时将返回 NULL
return NULL;
}
int main()
{
char arr1[20] = { '\0' };
char arr2[20] = { '\0' };
printf("请输入被查找字符串:"); gets(arr1);
printf("请输入被查找字符串:"); gets(arr2);
char* ret = my_strstr(arr1, arr2);
if (ret == NULL)
{
printf("没找到");
}
else
{
printf("找到了");
}
return 0;
}
纯净版:
#include<stdio.h>
#include<assert.h>
char* my_strstr(const char* str1, const char* str2)
{
assert(str1 != NULL && str2 != NULL);
char* cur = str1;
char* p2 = str2;
char* p1 = str1;
if (*str2 == '\0')
{
return str1;
}
while(*cur)
{
str1 = cur;
str2 = p2;
while (*str1 != '\0' && *str2 != '\0' && *str1 == *str2)
{
if (*str2 != '\0')
{
return cur;
}
}
cur++;
}
return NULL;
}
int main()
{
char arr1[20] = { '\0' };
char arr2[20] = { '\0' };
printf("请输入被查找字符串:"); gets(arr1);
printf("请输入被查找字符串:"); gets(arr2);
char* ret = my_strstr(arr1, arr2);
if (ret == NULL)
{
printf("没找到");
}
else
{
printf("找到了");
}
return 0;
}
测试结果:?
?
|