串(也可称为字符串),是由0个或多个字符组成的有限序列。可以用于文本编辑。
串中任意个连续的字符组成的子序列称为该串的子串。包含子串的串相应的称为主串。与线性表的存储结构相类似,串既可以用链式结构存储,也可以用数组形式存储。
串的基本操作与线性表类似,原理大致相同。而串进行模式匹配时可以用到KMP算法。
代码实现:(这里选用数组存储形式的串)
#include<stdio.h>
#include <string.h>
#include<stdlib.h>
#include <memory.h>
#define MAX 50
typedef unsigned char SString[MAX + 1];
void prin_1()
{
printf ("\n1、求子串函数\n");
printf("2、删除子串函数\n");
printf("3、插入子串函数\n");
printf("4、串置换\n");
printf("0、end\n");
puts("-------------------------------------------------\n");
}
/**创建串**/
void creatS(SString &s)
{
int n,i;
char a[MAX+1];
printf("请输入串s的字符:\n");
scanf("%s",a);
n=strlen(a);
s[0]=n;//下标为0的,用于存放串长
for(i=1;i<=n;i++)
{
s[i]=a[i-1];//将a数组的元素传给s
}
s[i+1]='\0';
}
/**串的输出**/
void printf_2(SString s)
{
int i;
for(i=1;i<=s[0];i++)
{
printf("%c",s[i]);
}
printf("\n");
}
/** 求子串函数 **/
int getSubStr(SString &s, int start, int len, SString &subStr)//start为子串开始位置,len为子串长度,subStr为子串
{
int i,j=1;
for(i=start+1;i<=start+len;i++)
{
subStr[j]=s[i];//将主串对应元素传给子串
j++;
subStr[0]=j;
}
subStr[i]='\0';
if(subStr[0]==0)
return 0;
else
return 1;
}
/**删除子串函数**/
int delSubStr(SString &s, int start, int len)//start为串删除开始位置,len为串删除长度
{
int i;
for(i=start+1;i<=(s[0]-start-len)+1;i++)
{
s[i]=s[i+len];//将起始位置之后的元素往前移动
}
s[i]='\0';
s[0]=s[0]-len;
if(i==s[0]-start-len)
return 0;
else
return 1;
}
/**插入子串函数**/
int insSubStr(SString &s, SString &subStr, int pos)//subStr为子串,pos为起始位置
{
int i,j=1;
char a;
int l=subStr[0];
for(i=s[0];i>=pos+1;i--)//将起始位置之后的元素往后移动
{
s[i+l]=s[i];
}
s[0]=s[0]+l;
s[s[0]+1]='\0';
for(i=pos+1;i<subStr[0]+pos+1;i++)//插入子串
{
a=s[i];
s[i]=subStr[j];
subStr[j]=a;
j++;
}
if(j==1)
return 0;
else
return 1;
}
/**串置换**/
int repStr(SString &s, SString &subStr, int pos)//subStr为子串,pos为起始位置
{
int i,j=1;
char a;
for(i=pos+1;i<subStr[0]+pos+1;i++)//直接将子串代替相应的主串元素
{
a=s[i];
s[i]=subStr[j];
subStr[j]=a;
j++;
}
if(j==1)
return 0;
else
return 1;
}
int main(void)
{
SString s,subStr;
int start,len,pos;
int a,b;
creatS(s);
while(1)
{
printf("\n请输入需要的操作:\n");
prin_1();
scanf("%d",&a);
if(a==0)
break;
switch(a)
{
case 1: ///求子串函数
{
printf("请输入开始位置:\n");
scanf("%d",&start);
printf("请输入字串长度:\n");
scanf("%d",&len);
memset(&subStr,0,sizeof(&subStr));
b=getSubStr(s,start,len,subStr);
if(b!=0)
printf_2(subStr);
else
printf("求取子串失败!\n");
break;
}
case 2: ///删除子串函数
{
printf("请输入开始位置:\n");
scanf("%d",&start);
printf("请输入字串长度:\n");
scanf("%d",&len);
b=delSubStr(s,start,len);
if(b!=0)
{
if(s[0]==0)
{
printf("删除后串为空串!\n");
}
else
{
printf("删除后的串为:\n");
printf_2(s);
}
}
else
printf("求取子串失败!\n");
break;
}
case 3: ///插入子串
{
printf("请输入开始位置:\n");
scanf("%d",&pos);
memset(&subStr,0,sizeof(&subStr));
creatS(subStr);
b=insSubStr(s,subStr,pos);
if(b!=0)
{
printf("串:\n");
printf_2(s);
}
else
printf("插入子串失败!\n");
break;
}
case 4:///串置换
{
printf("请输入开始位置:\n");
scanf("%d",&pos);
memset(&subStr,0,sizeof(&subStr));
creatS(subStr);
b=repStr(s,subStr,pos);
if(b!=0)
{
printf("置换串:\n");
printf_2(s);
}
else
printf("置换子串失败!\n");
break;
}
default :
printf("输入错误!\n");
break;
}
}
return 0;
}
运行结果: