字符串一般简称为串。
堆分配存储结构的串有顺序存储结构的特点,处理方便,操作中对串长又没有任何限制,更显灵活,因此选择堆分配存储串。
利用c语言实现字符串的基本操作(查找,替换,连接等):
c语言实现详细代码如下:
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef struct
{
char *ch;
int length;
}HString;
//chars为字符串常量,生成一个其值等于chars的串
Status StrAssign(HString *t,char *chars)
{
int i,j;
char *c;
if(t->ch)
{
free(t->ch);
}
for(i=0,c=chars;c[i]!='\0';i++)
if(!i)
{
t->ch=NULL;
t->length=0;
}
else
{
t->ch=(char *)malloc((i+1) * sizeof(char));
if(!(t->ch))
{
exit(OVERFLOW);
}
for(j=0;j<=i;j++)
{
t->ch[j]=chars[j];
}
t->length=i+1;
}
return OK;
}
//销毁串
Status DestroyString(HString *s)
{
free(s->ch);
s->ch=NULL;
s->length=0;
return OK;
}
//打印输出串
void print(HString T)
{
int i;
for(i=0;i<T.length;i++)
{
printf("%c",T.ch[i]);
}
printf("\n");
}
//求串的长度
int StrLength(HString S)
{
return S.length;
}
//清空串
Status ClearString(HString *s)
{
if(s->ch)
{
free(s->ch);
s->ch=NULL;
}
s->length=0;
return OK;
}
//返回由S1和S2拼接成的新串
Status Concat(HString *t,HString S1,HString S2)
{
int i;
ClearString(t);
t->ch=(char *)malloc((S1.length+S2.length) * sizeof(char));
if(!(t->ch))
{
exit(OVERFLOW);
}
for(i=0;i<S1.length;i++)
{
t->ch[i]=S1.ch[i];
}
t->length=S1.length+S2.length;
for(i=0;i<t->length;i++)
{
t->ch[S1.length+i]=S2.ch[i];
}
return OK;
}
//求子串
Status SubString(HString *sub,HString S,int pos,int len)
{
int i;
if(pos<1||pos>S.length||len<0||len>S.length-pos+1)
{
return ERROR;
}
if(sub->ch)
{
free(sub->ch);
}
if(!len)
{
sub->ch=NULL;
sub->length=0;
}
else
{
sub->ch=(char *)malloc(len *sizeof(char));
for(i=0;i<len;i++)
{
sub->ch[i]=S.ch[pos-1+i];
}
sub->length=len;
}
return OK;
}
//串的比较
int StrCompare(HString S,HString T)
{
int i;
for(i=0;i<S.length&&i<T.length;++i)
{
if(S.ch[i]!=T.ch[i])
{
return S.ch[i]-T.ch[i];
}
}
return S.length-T.length;
}
//返回主串中第pos个字符之后对一次出现的位置
int Index(HString S,HString T,int pos)
{
int i,m,n;
HString Sub;
HString *sub=⋐
Sub.ch=NULL;
if(pos>0)
{
n=StrLength(S);
m=StrLength(T);
i=pos;
while(i<n-m+1)
{
SubString(sub,S,i,m);
if(StrCompare(Sub,T)!=0)
{
++i;
}
else
{
return i;
}
}
}
return 0;
}
//在串的第pos个字符之前插入串T
Status StrInsert(HString *s,int pos,HString T)
{
int i;
if(pos<1||pos>s->length+1)
{
return ERROR;
}
if(T.length)
{
s->ch=(char *)realloc(s->ch,(s->length+T.length) * sizeof(char));
if(!s->ch)
{
exit(OVERFLOW);
}
for(i=s->length-1;i>=pos-1;--i)
{
s->ch[i+T.length]=s->ch[i];
}
for(i=0;i<=T.length-1;i++)
{
s->ch[pos-1+i]=T.ch[i];
}
s->length+=T.length;
}
return OK;
}
//从串S中删除第pos个字符起长度为len的子串
Status StrDelete(HString *s,int pos,int len)
{
int i;
if(pos<1||pos>s->length)
{
return ERROR;
}
for(i=pos+len-1;i<s->length;i++)
{
s->ch[i-len]=s->ch[i];
}
s->length-=len;
return OK;
}
//用V替换主串S中出现的所有与T相等的不重叠的子串
Status Replace(HString *s,HString T,HString V)
{
int n,d;
n=StrLength(T);
do
{
d=Index(*s,T,1);
StrDelete(s,d,n);
StrInsert(s,d,V);
}while(Index(*s,T,1));
return OK;
}
//主函数
void main()
{
//int i;
HString S,S1,S2,S3,T,U,V,W,*s;
//ClearString(s);
S.ch=NULL;
S1.ch=NULL;
S2.ch=NULL;
S3.ch=NULL;
T.ch=NULL;
U.ch=NULL;
V.ch=NULL;
W.ch=NULL;
s=&S1;
StrAssign(s,"THIS IS A BOOK");
s=&S2;
StrAssign(s,"ESE ARE");
s=&U;
StrAssign(s,"XYXYXYXYXYXY");
s=&S;
StrAssign(s,"S");
s=&W;
StrAssign(s,"W");
s=&S3;
SubString(s,S1,3,7);
s=&V;
SubString(s,U,6,3);
//s=&T;
printf("S1=");print(S1);
printf("S2=");print(S2);
printf("U=");print(U);
printf("S=");print(S);
printf("W=");print(W);
printf("S3=");print(S3);
printf("V=");print(V);
//Concat(s,S1,S);
Replace(s,S3,S2);
s=&U;
Replace(s,V,W);
printf("S1=");
print(S1);
printf("T=");
print(T);
printf("U=");
print(U);
/*
DestroyString(&S);
DestroyString(&S1);
DestroyString(&S2);
DestroyString(&S3);
DestroyString(&T);
DestroyString(&U);
DestroyString(&V);
DestroyString(&W);*/
}
得到的结果如下图所示: