一、代码如下
/*
项目名称:串的堆分配存储表示
编译环境:VC++ 2008
作者相关:。。。
最后修改:2019.10.01
学习目标:赋值、复制、判空、比较、求长、清空、连接、返回子串、
返回子串下标、替换子串、插入字串
注意事项:1.测试所有功能是否正常
2.SubString函数中len最大值为StrLength(S)-pos+1
例:12345,长度为5,即5-1+1=5
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define ERROR 0
#define OK 1
#define TRUE true
#define FALSE false
typedef bool Status;
typedef struct{
char *ch;//非空串按串长分配存储区,否则ch为NULL
int length;
}HString;
Status InitStr(HString &T);
Status StrAssign(HString &T,char* chars);//chars表示字符串
Status StrCopy(HString &T,HString S);//将串S复制给串T
Status StrEmpty(HString S);
int CharsLength(char *chars);
int StrLength(HString S);
int StrCompare(HString S,HString T);//S>T,返回值>0,以此类推
Status ClearString(HString &S);//清空串并释放空间
Status Concat(HString &T,HString S1,HString S2);//T返回S1,S2连接而成的新串
Status SubString(HString &Sub,HString S,int pos,int len);//返回串S的第pos个字符起长度为len的字串
int Index(HString S,HString T,int pos);//返回字串在主串pos之后第一次出现的位置
Status Replace(HString &S,HString T,HString V);//V替换S中与T相等不重叠的字串
Status StrInsert(HString &S,int pos,HString T);//在S第pos个字符之前插入T
Status StrOut(HString S);
int main()
{
//定义变量及初始化
HString S,T1,T2,Sub,V;
InitStr(S);
InitStr(T1);
InitStr(T2);
InitStr(Sub);
InitStr(V);
char chars[]="12345";
char chars1[]="123456";
char chars2[]="abcd";
//赋值操作
StrAssign(T1,chars);
printf("赋值后T1");
StrOut(T1);
//复制操作
StrCopy(S,T1);
printf("复制后S");
StrOut(S);
//比较操作
StrAssign(T1,chars1);
printf("赋值后T1");
StrOut(T1);
int result=StrCompare(T1,S);
printf("串S,T1比较结果:");
if(result==0)
printf("T1==S\n\n");
else if(result>0)
printf("T1>S\n\n");
else
printf("T1<S\n\n");
//连接操作
StrAssign(T2,chars);
printf("赋值后T2");
StrOut(T2);
Concat(S,T1,T2);
printf("T1与T2连接后S");
StrOut(S);
//截取字串操作
SubString(Sub,S,3,4);
printf("S串返回的起点为3,长度为4的Sub");
StrOut(Sub);
//返回字串在主串制定pos后第一次出现的位置
StrCopy(T1,Sub);
printf("复制后T1");
StrOut(T1);
int location=Index(S,T1,1);
printf("字串在主串pos=1之后第一次出现的位置为:%d\n\n",location);
//替换操作
StrAssign(V,chars2);
printf("赋值后V");
StrOut(V);
printf("T1");
StrOut(T1);
Replace(S,T1,V);
printf("V替换T1后S");
StrOut(S);
//插入操作
StrInsert(S,1,V);
printf("在第一个位置前插入V串的S");
StrOut(S);
return 0;
}
Status InitStr(HString &T)
{
T.ch=NULL;
T.length=0;
return OK;
}
Status StrAssign(HString &T,char* chars)//源代码里要求的是长度,不是字节
{
int k = CharsLength(chars);
if(T.ch) free(T.ch);//复制之前释放T串
if(!k)
{
T.ch=NULL;
T.length=0;
}
else
{
T.ch = (char*)malloc(k*sizeof(char));
T.length = k;
for(int i=0;i<k;i++)
T.ch[i] = chars[i];
}
return OK;
}
Status StrCopy(HString &T,HString S)
{
if(!S.ch)
return ERROR;
if(T.ch)
{
free(T.ch);
T.ch=NULL;
T.length=0;
}
T.ch=(char*)malloc(S.length*sizeof(char));
for(int i=0;i<S.length;i++)
T.ch[i]=S.ch[i];
T.length=S.length;
return OK;
}
Status StrEmpty(HString S)
{
if(!S.length)
return TRUE;
else
return FALSE;
}
int CharsLength(char *chars)
{
return strlen(chars);
}
int StrLength(HString S)
{
return S.length;
}
int StrCompare(HString S,HString T)
{
for(int 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;//若比较的字符全部相等的话
}
Status ClearString(HString &S)
{
if(S.ch)
{
free(S.ch);
S.ch=NULL;
}
S.length=0;
return OK;
}
Status Concat(HString &T,HString S1,HString S2)
{
if(T.ch)
{
free(T.ch);
T.ch=NULL;
T.length=0;
}
int SumLength=S1.length+S2.length;
T.ch=(char *)malloc(SumLength*sizeof(char));
for(int i=0;i<S1.length;i++)
T.ch[i]=S1.ch[i];
for(int i=S1.length;i<SumLength;++i)
T.ch[i]=S2.ch[i-S1.length];
T.length=SumLength;
return OK;
}
Status SubString(HString &Sub,HString S,int pos,int len)
{
if(pos<1||pos>StrLength(S)||len<0||len>StrLength(S)-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(int i=0;i<len;i++)
Sub.ch[i]=S.ch[i+pos-1];
Sub.length=len;
}
return OK;
}
int Index(HString S,HString T,int pos)
{
HString Sub;
InitStr(Sub);
if(pos<=0)
return ERROR;
int n=StrLength(S);
int m=StrLength(T);
int i=pos;
while(i<=n-m+1)
{
SubString(Sub,S,i,m);//这里误把i写成pos
if(StrCompare(Sub,T)!=0)
++i;
else
return i;
}
return 0;
}
Status Replace(HString &S,HString T,HString V)//默认串V和T长度相同
{
if(!S.ch||!T.ch||!V.ch)//存在串不存在
return ERROR;
int n=StrLength(S);
int m=StrLength(T);
int i=1,j=0;
HString Sub;
InitStr(Sub);
while(i<=n-m+1)
{
SubString(Sub,S,i,m);
if(!StrCompare(Sub,T))
{
int k=i-1;
while(j<m)
{
S.ch[k]=V.ch[j];
++k;
++j;
}
}
++i;
}
return OK;
}
Status StrInsert(HString &S,int pos,HString T)
{
if(pos<1||pos>S.length+1)
return ERROR;
if(!StrEmpty(T))
{
if(!(S.ch=(char*)realloc(S.ch,(S.length+T.length)*sizeof(char))))
return ERROR;
}
for(int i=S.length-1;i>=pos-1;--i)//pos之后(包括pos)后移T.length个单位
S.ch[i+T.length]=S.ch[i]; //这样pos之前腾出T.length个空间
for(int j=0;j<T.length;++j)//插入T
S.ch[pos-1+j]=T.ch[j];
S.length+=T.length;
return OK;
}
Status StrOut(HString S)
{
printf("串内容: ");
for(int i=0;i<S.length;i++)
{
printf("%c",S.ch[i]);
}
printf("\n\n");
return OK;
}
二、运行结果