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;
}