模拟strstr函数有一个小bug

const char* My_strstr(const char *long_str,const char short_str)
{
int long_str_i = 0;
int short_str_i = 0;
const char
start = NULL;

while ((long_str[long_str_i] != '\0') && (short_str[short_str_i] != '\0')) //判断长字符和短字符是否接收到‘\0’
{
    //外循环
    start = &long_str[long_str_i];   //定义从那个地方开始

    while (long_str[long_str_i] == short_str[short_str_i]) //内循环
    {
        long_str_i++;
        short_str_i++;
    }

    if (short_str[short_str_i] == '\0') //如果短字符接收到'\0'返回到起始位
    {
         return start;
    }
    
    start++;
    long_str_i=long_str_i+1; //长字符往后偏移
    //short_str_i =short_str+1;
    //short_str_i=0;//段字符串停止
}
return NULL; //返回

}

这是判断短字符串是否在长字符中,并返回在长字符串中的位置吗?
(1)外层while中的条件不需要判断短字符串。
(2)每次循环,short_str_i 需要重置为0
(3)内层while需要判断长字符和短字符串是否已经到结尾。
代码修改如下:

#include <stdio.h>

const char* My_strstr(const char *long_str,const char* short_str)
{
    int long_str_i = 0;
    int short_str_i = 0;
    const char *start = NULL;

    while ((long_str[long_str_i] != '\0') ) //判断长字符和短字符是否接收到‘\0’
    {
        //外循环
        start = &long_str[long_str_i];   //定义从那个地方开始
        short_str_i = 0;//这里重置0
        while (long_str[long_str_i]!='\0' &&short_str[short_str_i] !='\0' && long_str[long_str_i] == short_str[short_str_i]) //内循环
        {
            long_str_i++;
            short_str_i++;
        }

        if (short_str[short_str_i] == '\0') //如果短字符接收到'\0'返回到起始位
        {
            return start;
        }

        //start++;//这一句没用
        long_str_i=long_str_i+1; //长字符往后偏移
        //short_str_i =short_str+1;
        //short_str_i=0;//段字符串停止
    }
    return NULL; //返回
}


完整代码及测试代码如下:

#include <stdio.h>

const char* My_strstr(const char *long_str,const char* short_str)
{
    int long_str_i = 0;
    int short_str_i = 0;
    const char *start = NULL;

    while ((long_str[long_str_i] != '\0') ) //判断长字符和短字符是否接收到‘\0’
    {
        //外循环
        start = &long_str[long_str_i];   //定义从那个地方开始
        short_str_i = 0;//这里重置0
        while (long_str[long_str_i]!='\0' &&short_str[short_str_i] !='\0' && long_str[long_str_i] == short_str[short_str_i]) //内循环
        {
            long_str_i++;
            short_str_i++;
        }

        if (short_str[short_str_i] == '\0') //如果短字符接收到'\0'返回到起始位
        {
            return start;
        }

        //start++;//这一句没用
        long_str_i=long_str_i+1; //长字符往后偏移
        //short_str_i =short_str+1;
        //short_str_i=0;//段字符串停止
    }
    return NULL; //返回
}

int main()
{
    char longstr[100],shortstr[20];
    const char* p;
    scanf("%s %s",longstr,shortstr);
    p = My_strstr(longstr,shortstr);
    printf("%s",p);
    return 0;
}

short_str_i每次循环应该归零
另外long_str_i的变化也是错误的
按照你的代码逻辑尽量保持,那么修改如下:


const char* My_strstr(const char *long_str,const char *short_str)
{
    int long_str_i = 0;
    int short_str_i = 0;
    const char *start = NULL;

    while ((long_str[long_str_i] != '\0') && (short_str[short_str_i] != '\0')) //判断长字符和短字符是否接收到‘\0’
    {
        //外循环
        start = &long_str[long_str_i];   //定义从那个地方开始

        while (long_str[long_str_i] != '\0' && (long_str[long_str_i] == short_str[short_str_i])) //内循环
        {
            long_str_i++;
            short_str_i++;
        }

        if (short_str[short_str_i] == '\0') //如果短字符接收到'\0'返回到起始位
        {
            return start;
        }

        long_str_i=start-long_str+1; //长字符往后偏移--------但原先直接在long_str_i基础上加1是不对的,因为上方的while循环会修改long_str_i的值,所以只能用start来处理
        short_str_i=0;   //---------------------short_str_i每轮比较结束后应该重新置为0
        start++;
    }
    return NULL; //返回
}

 int main()
 {
     char s1[100],s2[50];
     const char *p = NULL;
     gets(s1);
     gets(s2);
     p = My_strstr(s1,s2);
     if(p==NULL)
         printf("无子串");
     else
        printf("子串起点:%d",p-s1);
     return 0;
 }

#include <stdio.h>

const char *my_strstr(const char *str, const char *substr)
{
    while (*str)
    {
        const char *p = str;
        const char *q = substr;
        while (*p && *q && *p == *q)
        {
            p++;
            q++;
        }
        if (*q == '\0')
            return str;
        str++;
    }
    return NULL;
}

#define N 50

int main()
{
    char str[N], substr[N];
    while (scanf("%s%s", str, substr) == 2)
    {
        const char *p = my_strstr(str, substr);
        if (p)
            printf("find substr at index %ld\n", p - str);
        else
            printf("str does not contain substr.\n");
    }
    return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632