c语言怎么输入原串,读取一行子串 并查找子串出现的所在位置?

大神,请教一下,c语言怎么输入原串,读取一行子串 并查找子串出现的所在位置?
最新回答
忱杏

2024-04-27 08:23:56

代码逻辑:

一、同时遍历原串和子串,完全匹配记则录起始位置到list数组,下个回合从原串当前遍历的位置字符开始下回合比较。

二、当前遍历比较不匹配,从原串下一个字符开始新的回合比较。

三、最终返回的数组list就是所有匹配的起始位置。

#include<stdio.h>

#include<string.h>

#define M1 200//原串的最大长度

#define M2 50//子串的最大长度 M2必须小于等于M1

int prString(char str[]);//打印输出字符串,返回字符串长度

int *findStr1FStr2(char str1[],char str2[],int *ln);//在str1中查找所有匹配的str2位置,返回多个位置数组。参数ln用于接收返回值数组的长度,传递一个整型变量地址

int main()

{

    int i,*list=NULL,ln;

    char str1[M1+1],str2[M2+1];

    printf("请输入一行原串(不超过%d个字符):\n",M1);

    scanf("%s",str1);

    prString(str1);

    str1[M1]=0;//保险,确保字符串结构完整

    printf("请输入一行子串(不超过%d个字符):\n",M2);

    scanf("%s",str2);

    prString(str2);

    str2[M2]=0;

    list=findStr1FStr2(str1,str2,&ln);

    for(i=0;i<ln;i++)

        printf("在原字符串%d位置找到子串\n",list[i]);

    return 0;

}

int *findStr1FStr2(char str1[],char str2[],int *ln)

{

    static int list[M1/M2+1];

    int i=0,len=0;

    char *p1=str1,*p2=str2,*st=str1;

    while(*p1!=0)

    {

        if(strlen(p1)<strlen(p2))//原串剩余内容小于子串直接结束检查

            break;

        while(*p2!=0)

        {

            if(*p1==0)

                break;

            if(*p2!=*p1)

                break;

            p1++,p2++;

        }

        if(*p2==0)//找到一次匹配,记录位置

            list[i++]=st-str1,len++,st=p1;

        else//不匹配,从下一个字母开始新回合检查

            p1=++st;

        p2=str2;

    }

    *ln=len;

    return list;

}

int prString(char str[])

{

    int len=0;

    len=strlen(str);

    printf("输入的字符串长度为%d,内容为%s\n",len,str);

    return len;

}