strstr函数:在一段长字符串中找出对应的短字符串("abcdef"中找出"bcd",即找字符串子集)
//strstr函数
int main()
{
char arr1[100] = "abcdefdedede";
char arr2[] = "de";
char* ret = strstr(arr1, arr2);//将找到的子字符串的地址传给ret
if (NULL == ret)
{
printf("找不到");
}
else
{
printf("%s\n", ret);
}
return 0;
}
例子直观明了,找到de后会将d的地址传回char* ret,打印由于地址的连续存放的,所以会将de后面的字符也打印出来
代码解释如图
由于strstr返回地址,从而可以实现链式访问
char* my_strstr(const char* str1, const char* str2)//const提高代码健壮性
{
assert(str1 && str2);//断言
const char* s1 = str1;//操作一份新的拷贝字符防止str1乱动从而无法回到初始位置
const char* s2 = str2;
const char* cur = str1;//目标标记
while (*cur)
{
s1 = cur;//s1要看cur的脸色,与cur++的位置匹配
s2 = str2;//每次第二个while因为字符不匹配而跳出循环回到第一个while,则str2指向要重新回到最初位置
while (*s1 && *s2 && (*s1 == *s2))//当第一次出现匹配字符,并且s1,s2不为NULL
{
s1++;
s2++;
}
if (*s2 == '\0')//当第二个while遍历匹配完成,如果s2=='\0',则说明匹配成功,找到了子字符串
{
return ((char*)cur);//类型有所差异,强制类型转换
}
cur++;//第二关while循环每次匹配失败跳出循环时,cur会++,从而从++的位置重新匹配
}
return NULL;//找不到返回空指针
}
int main()
{
char arr1[20] = "abbbcdefwfw";
char arr2[] = "bbc";
char* ret = my_strstr(arr1, arr2);
if (NULL == ret)
{
printf("找不到子串\n");
}
else
{
printf("%s\n", ret);
}
return 0;
}
代码解释参考注释