串的操作及其应用
#include<stdio.h>
#include<stdlib.h>
typedef char ElementType;
#define MaxSize 60
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define NULL 0
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef struct
{
ElementType data[MaxSize];
int length;// 串长度
}SqString;
void StrAssign(SqString &S,char str[]) //串赋值
{
int i=0;
for(i=0;str[i]!='\0';i++)
S.data[i]=str[i];
S.length=i+1;
}
int StrCompare(SqString &S,SqString &T)//若S>T,则返回值>0;若S=T,则返回值=0;否则返回值<0
{
int i;
for(i=0;i<S.length&&i<T.length;i++)
if(S.data[i]!=T.data[i])
return (S.data[i]-T.data[i]);
return (S.length-T.length);
}
int StrLength(SqString &S) /*返回串的长度*/
{
int i;
for(i=0;(S.data[i])!='\0';i++);
S.length=i;
return S.length;
}
Status Concat(SqString &S,SqString &S1,SqString &S2)//用S返回由串S1和S2联结而成的新串,若未截断,则返回TRUE,否则返回FALSE
{
int i;
if (S1.length+S2.length<=MaxSize)//未截断
{
for(i=0;i<S1.length;i++)
S.data[i]=S1.data[i];
S.length=S1.length+S2.length;
for (i=S1.length;i<S.length;i++)
S.data[i]=S2.data[i];
return TRUE;
}
else if(S1.length<=MaxSize)//截断S2
{
for (i=0;i<S1.length;i++)
S.data[i]=S1.data[i];
S.length=MaxSize;
for (i=S1.length;i<S.length;i++)
S.data[i]=S2.data[i];
return FALSE;
}
else//截断S1,或仅取S1
{
for(i=0;i<MaxSize;i++)
S.data[i]=S1.data[i];
S.length=MaxSize;
return FALSE;
}
}
Status SubString(SqString &Sub, SqString &S, int pos, int len)
//用Sub返回串S的第pos个字符起长度为len的子串。其中,1<=pos<=StrLength(S) 且 0<=len<=StrLength(S) -pos + 1 。
{
int i;
if(pos<1||pos>S.length||len<0||len>S.length-pos+1)
return ERROR;
for(i=pos-1;i<pos+len;i++)
Sub.data[i]=S.data[i];
Sub.length=len;
return OK;
}
Status StrEmpty(SqString &S)//若S为空串,则返回TRUE,否则返回FALSE
{
if(S.length==0)
return TRUE;
else
return FALSE;
}
Status StrCopy(SqString &S,SqString &T) /*由串T复制得串S,若未截断,则返回TRUE,否则返回FALSE*/
{
int i;
if(T.length<=MaxSize)
{
for(i=0;i<T.length;i++)/*将串T的字符赋值给串S*/
S.data[i]=T.data[i];
S.length=T.length; /*将串S的长度赋值给串T*/
return TRUE;
}
else
{
for(i=0;i<MaxSize;i++)
S.data[i]=T.data[i];
S.length=MaxSize;
return FALSE;
}
}
Status StrInsert(SqString &S,int pos,SqString &T)//在串S的第pos个字符之前插入串T
{
int i;
if(pos<1||pos>S.length+1)
return ERROR;//pos不合法
if(S.length+T.length<=MaxSize)
{
for(i=S.length+T.length-1;i>=pos-1+T.length;i--)
S.data[i]=S.data[i-T.length];
for(i=0;i<T.length;i++)
S.data[pos-1+i]=T.data[i];
S.length=S.length+T.length;
return TRUE;
}
else if(pos-1+T.length<=MaxSize)
{
for(i=MaxSize-1;i>pos+T.length-1;i--)
S.data[i]=S.data[i-T.length];
for(i=0;i<T.length;i++)
S.data[pos-1+i]=T.data[i];
S.length=MaxSize;
return FALSE;
}
else
{
for(i=0;i<MaxSize-pos+1;i++)
S.data[pos-1+i]=T.data[i];
S.length=MaxSize;
return FALSE;
}
}
Status StrDelete(SqString &S,int pos,int len)/*从串S中删除第pos个字符起长度为len的子串*/
{
int i;
if(pos<0||len<0||pos+len-1>S.length)
return FALSE;
else
{
for(i=pos+len;i<=S.length-1;i++)
S.data[i-len]=S.data[i];
S.length=S.length-len;
return TRUE;
}
}
void StrClear(SqString &S) /*清空串,只需要将串的长度置为0即可*/
{
S.length=0;
}
int Index(SqString &S,SqString &T,int pos)//若主串S中存在和串T相等的子串,则返回它在主串S中第pos个字符之后第一次出现的位置;否则返回0
{
int n,m,i;
SqString Sub;
if(pos>0)
{
n=StrLength(S);
m=StrLength(T);
i=pos;
for(i=0;i<=n-m+1;i++)
{
SubString(Sub,S,i,m);
if(StrCompare(Sub,T)!=0);
else
return i;
}
}
return FALSE;
}
void DispStr(SqString &S)//打印操作
{
int i;
if (S.length>0)
{
for(i=0;i<S.length;i++)
printf("%c",S.data[i]);
printf("\n");
}
}
Status Replace(SqString &S,SqString &T,SqString &V)//用V替换主串S中出现的所有与T相等的不重叠的子串
{
int i; //从串S的第一个字符起查找串T
if(StrEmpty(T)==NULL) // T是空串
return ERROR;
for(i=1;;i+=StrLength(V))
{
i=Index(S,T,i); // i为从上一个i之后找到的子串T的位置
if(i) // 串S中存在串T
{
StrDelete(S,i,StrLength(T)); // 删除该串T
StrInsert(S,i,V); // 在原串T的位置插入串V
}
}
return OK;
}
void C(SqString &S)
{
char str[MaxSize];
printf("请输入要赋值的字符串:");
gets(str);
getchar();
StrAssign(S,str);
}
void I(SqString &S)
{
int pos;
SqString T;
printf("请输入要插入的起始位置:");
scanf("%d",&pos);
printf("\n");
printf("请输入要插入的字符串:");
gets(T.data);
StrInsert(S,pos,T);
}
void D(SqString &S)
{
int pos,len;
printf("请输入要删除的起始位置:");
scanf("%d",&pos);
printf("\n");
printf("请输入删除长度:");
scanf("%d",&len);
StrDelete(S,pos,len);
}
void R(SqString &S)
{
int pos,len;
SqString T,V;
printf("请输入要置换的起始位置:");
scanf("%d",&pos);printf("\n");
printf("请输入置换长度:");
scanf("%d",&len);
printf("\n");
SubString(T, S, pos,len);
printf("请输入将要换入的字符串:");
gets(V.data);
Replace(S,T,V);
}
void main()
{
char c1;
SqString S;
int i=1;
while(i==1)
{
printf("输入C: 表示要求根据用户输入的以回车为结束符的字符串建立顺序串\n");
printf("输入I:表示要求输入,然后输入插入的起始位置和要插入的字符串\n");
printf("输入D:表示要求删除,然后输入删除的起始位置和删除长度\n");
printf("输入R:表示要求置换,然后输入置换的起始位置、置换长度和将要换入的字符串\n");
printf("输入E:结束串编辑\n");
printf("请选择要实现的功能\n");
c1=getchar();
getchar();
switch(c1)
{
case'C':C(S);
case'I':I(S);
case'D':D(S);
case'R':R(S);
case'E':exit(0);
default:printf("error\n");
}
printf("还进行编辑吗?Y OR N?:");
printf("\n");
c1=getchar();
if(c1=='Y'||c1=='y')
i=1;
else
i=0;
}
printf("该串为:");
DispStr(S);
printf("\n");
}
编译没错,但是就是运行有问题,可以帮忙找出什么问题么?