strstr代码模拟实现中的问题

img


这个while(*cp)循环里面的东西看不明白,最后是怎么把子集里的数打印出来的呀,返回去的不是CP地址么

strstr的作用是在字符串s1里面查找是否有字符串s2

  • 如果有,返回字符串s2在字符串s1里的起始地址
  • 如果没有,返回NULL

image-20220125172632888

模拟实现

str函数的模拟实现相对来说比较复杂

最重要的就是遇到多个字符相同而最后不同的情况

  • 需要用另外一个指针C来遍历字符串,找寻C和ptr2所指元素相等的第一个字符
  • 然后用ptr1来和ptr2比较,C保持不变
  • 如果匹配成功,返回C指针
  • 如果匹配失败,C++后赋值给ptr1,继续进行查找

image-20220125181435767

//5.strstr 判断str1里面有没有str2
//如果有,返回str1里str2的起始地址
//如果str1不包含str2,返回null
char* my_strstr(const char* str1, const char* str2)
{
    const char* s1 = str1;
    const char* s2 = str2;
    const char* cur = str1;
    assert(str1 && str2);
    if (*str2 == '\0')
    {
        return (char*)str1;
    }
    while (*cur)
    {
        s1 = cur;
        s2 = str2;
        while (*s1 && *s2 && *s1 == *s2)
        {
            s1++;
            s2++;
        }
        if (*s2 == '\0')
            return (char*)cur;

        cur++;
    }
    return NULL;
        
}
int main()
{
    char arr1[15] = { "helloworld" };
    char arr2[] = { "owo" };
    char* p=strstr(arr1, arr2);
    if (p == NULL)
    {
        printf("找不到\n");
    }
    else
    {
        printf("%s\n", p);
    }
    return 0;
}

如果对你有帮助,还请点个采纳,万分感谢!

cp是指向字符串str1当前字符的位置,然后while循环里面比较从cp开始的字符串和字符串str2,如果str2匹配到字符串结尾,说明在str1中找到了子串,则返回cp,否则cp移到下一个字符,重新比较字符串。
strstr()函数返回的是str2str1第一次出现的首地址或NULL