判断串T是否为串S的子串,若是返回在主串中的位置
算法思想:
{将主串S的第一个字符和串T第一个字符进行比较,【若相等则继续比较后面的字符,(若全部一致则说明字符串T为串S 的子串,且主串S开始比较的第一个元素的下标就为子串在主串S 中的位置);(若后续比较不一致则说明此次匹配不成功,返回与串第一个字符比较的开始】;
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
//串的顺序存储定义
typedef struct
{
char ch[MAXSIZE];
int length;
}SString;
//串的初始化
void StrAssign(SString&S,char cs[])
{
int i;
for(i=0;cs[i]!='\0'&&i<MAXSIZE;i++)
S.ch[i]=cs[i];
S.length=i;
}
//串的打印
void print(SString S)
{
int i;
for(i=0;i<S.length;i++)
{
printf("%c",S.ch[i]);
}
}
//串的复制 将串T中的数据拷贝到串S中,使得输出的串S中的数据变成串T中的数据
void StrCopy(SString &S,SString T)
{
int i;
for(i=0;i<T.length;i++)
{
S.ch [i]=T.ch[i];
S.length=T.length;
}
}
//串的连接 将串T连接在串S后面
int StrCat(SString&S,SString T)
{
int i,flag;
if(S.length+T.length<=MAXSIZE)
{
for(i=S.length;i<S.length+T.length;i++)
{
S.ch[i]=T.ch[i-S.length];
}
S.length=S.length+T.length;
flag=1;
}
else if(S.length<MAXSIZE)
{
for(i=S.length;i<MAXSIZE;i++)
{
S.ch[i]=T.ch[i-S.length];
}
S.length=MAXSIZE;
flag=0;
}
else
flag=0;
return flag;
}
//串的删除操作 删除一个串中从下标第pos位置起,长度为length的字符
int StrDelete(SString &S,int pos,int length)
{
int i;
if(pos<0||pos>S.length-length)
return 0;
else
for(i=pos+length;i<S.length;i++)
{
S.ch[i-length]=S.ch[i];
}
S.length=S.length-length;
return 1;
}
//判断串T是否为串S的子串,若是返回在主串中的位置
int StrIndex(SString S,int pos1,SString T)
{
int i,j;
if(T.length==0)
return 0;
i=pos1;
j=0;
while(i<S.length&&j<T.length)
{
if(S.ch[i]==T.ch[j])
{
i++;
j++;
}
else
{
i=i-j+1;
j=0;
}
}
if(j>=T.length)
return i-j;
else
return 0;
}
int main()
{
char str[MAXSIZE];
SString S,T;
printf("输入串S:\n");
gets(str);
StrAssign(S,str);//调用串的初始化函数
printf("输出串S:\n");
print(S);
printf("\n");
printf("输入串T:\n");
gets(str);
StrAssign(T,str);
printf("输出串T:\n");
print(T);
printf("\n");
int pos1,D;
pos1=0;
D=StrIndex(S,pos1,T);
if(D==0)
printf("不为子串\n");
else
{
printf("子串的位置为:%d\n",D);
}
/*StrCopy(S,T);//调用拷贝函数
printf("拷贝后的串为:\n");
print(S);
printf("\n");*/
//连接函数
StrCat(S,T);//调用连接函数
printf("连接后的串为:\n");
print(S);
printf("\n");
int pos,length;
printf("请输入要删除字符开始的下标:\n");
scanf("%d",&pos);
printf("请输入要删除字符的长度:\n");
scanf("%d",&length);
StrDelete(S,pos,length);//调用删除函数
print(S);
printf("\n");
}