strstr函数指的是在目标字符串 string 中寻找是否存在子字符串 strCharSet.
先找到strstr函数定义:
char *strstr(const char *string, const char *strCharSet);
这里使用 char* 接收地址并且作为返回值。
并且接收的string 和 strCharSet地址使用了const修饰,所以这两个值不能修改。
模拟实现思路:
1、由于const修饰的地址不能被修改,并且这里后续运算需要变动指针的值,所以需要创建新的指针变量来进行运算。
2、我在这里创建了:
char* pd指针指向string
char* ps指针指向strCharSet
char* pdret进行数组的遍历运算
这里的pdret是零时变量,pd的作用只是找到两个字符串中相同元素的首字母,pdret的作用才是首字母后面的比较部分。
3、首先遍历找到string字符串中与 strCharSet字符串首元素 相同的字符,
然后从刚才找到的字符位置起,遍历比较两个字符串是否相等,
当* ps == 0,或者* pdret == 0时跳出循环
*ps == 0表示strCharSet为首字母的字符串遍历完成,字符串source是目标字符串dest的子字符串。
* pdret == 0表示string为首字母的字符串遍历完成,字符串source不是目标字符串dest的子字符串。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
char *MyStrstr(const char *string, const char *strCharSet)
{
assert(string != NULL);
assert(strCharSet != NULL);
char* pd = (char*)string; //创建指针变量,需要强制类型转换
char* ps = (char*)strCharSet;
while (*pd) //pd指向字符为0结束循环
{
char* pdret = pd; //创建零时变量pdret并初始化为pd
ps = (char*)strCharSet; //ps初始化为strCharSet
while (*pdret != *ps) //寻找pdret数组中与ps首字母相同的元素
{
pdret++;
}
pd = pdret; //将找到的首字母的位置赋给pd(这一步是为了提高效率)
while (*ps++ == *pdret++) //遍历判断相等
{
if (*ps == 0) //strCharSet为首字母的字符串遍历完成
{
return pd;
}
else if (*pdret == 0) //string为首字母的字符串遍历完成
{
break;
}
}
pd++; //pd加一
}
return NULL; //找不到返回空
}
int main()
{
char dest[] = "aabbbbbcda";
char source[] = "bbc";
printf("%s\n", MyStrstr(dest, source));
return 0;
}