串(String)是零个或多个字符组成的有限序列。一般记作:S=“a1a2a3…an”,
其中,S是串名; “a1a2a3…an”是串值;ai(1≤i≤n)可以是字母、数字或其它字符;
串的长度:串中所包含的字符个数;
空串:长度为零的串称为空串(Empty String),它不包含任何字符。
空白串: 通常将仅由一个或多个空格组成的串称为空白串(Blank String)。
注意:空串和空白串的不同。
串赋值: StrAssign(&S, chars)
串比较: StrCompare(S, T)
求串长: StrLength(S)
串联接: Concat(&T,S1,S2)
求子串: SubString(&sub, S, pos, len)
串复制 : StrCopy(&T,S)
子串定位: Index(S,T,pos)
定长顺序存储
typedef struct{
char ch[MaxStrlen];
int length;
}SqString;
堆分配存储:
typedef struct{
char *ch;
int length;
}Hstring;
1.定义串结构体,以堆分配的存储方式
#include
#include
#include
#include
#define Max 20
#define error 0
#define overflow -2
#define ok 1
#define true 1
#define false 0
typedef struct
{
char *ch;
int length;
}HString;
typedef int Status;
2.初始化串
//初始化串
void InitString(HString &s)
{
s.ch=NULL;
s.length=0;
}
3.串赋值
//串赋值
Status StrAssign(HString &T,char *str)
{
int i,j;
InitString(T);
i=strlen(str);
if(!i)
return error;
else
{
T.ch=(char*)malloc(i*sizeof(char));
if(!T.ch)
exit (overflow);
for(j=0;j
4. 判断串非空
//判断串非空
Status StrEmpty(HString &T)
{
if(T.length==0&&T.ch==NULL)
return true;
else
return false;
}
5.串赋值
//串复制,将S赋给T
Status StrCopy(HString &T,HString S)
{
int i;
InitString(T);
if(StrEmpty(S))
return error;
T.ch=(char*)malloc(S.length*sizeof(char));
if(!T.ch)
exit(overflow);
for(i=0;i
6.串比较
//串比较
Status StrCmp(HString S,HString T)
{
int i;
for(i=0;i
7.求串长
Status StrLength(HString S)
{
if(StrEmpty(S))
return error;
else
return S.length;
}
8.串清空
//串清空,恢复到初始化时刻
Status ClearString(HString &s)
{
if(s.ch)
{
free(s.ch);
s.ch=NULL;
}
s.length=0;
return ok;
}
9.串拼接
//串拼接,将S1,S2拼接后用T返回
Status Concat(HString &T,HString S1,HString S2)
{
int i;
InitString(T);
T.length=S1.length+S2.length;
T.ch=(char*)malloc(T.length*sizeof(char));
if(!T.ch)
exit(overflow);
for(i=0;i
10.求子串
//求子串,将S从第pos位起len个长度的子串用Sub返回
Status SubString(HString &Sub,HString S,int pos,int len)
{
int i;
InitString(Sub);
if(StrEmpty(S))
return error;
if(pos<1||pos>S.length||len<0||pos+len-1>S.length)
return error;
if(len)
{
Sub.ch=(char*)malloc(len*sizeof(char));
if(!Sub.ch)
exit(overflow);
for(i=0;i
11.串索引
//串索引,返回T在S中第pos个字符后第一次出现的位置
Status Index(HString S,HString T,int pos)
{
int s,t,i;
HString Sub;
InitString(Sub);
if(pos>0)
{
s=S.length;
t=T.length;
i=pos;
while(i+t-1<=s)
{
SubString(Sub,S,i,t);
if(StrCmp(Sub,T))
i++;
else
return i;
}
}
return 0;
}
12.串插入
//串插入
Status StrInsert(HString &S,int pos,HString T)
{
int i;
if(pos<1||pos>S.length+1)
return error;
if(StrEmpty(T))
return error;
else
{
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
13.串删除
//串删除
Status StrDelete(HString &S,int pos,int len)
{
int i;
if(StrEmpty(S))
return error;
if(pos<1||pos+len-1>S.length||len<0)
return error;
for(i=pos-1;i+len<=S.length;i++)
S.ch[i]=S.ch[i+len];
S.length-=len;
S.ch=(char*)realloc(S.ch,S.length*sizeof(char));
return ok;
}
14.串替换
//串替换 ,用v替换主串中所有与T相等的不重叠子串
Status Replace(HString &S,HString T,HString V)
{
int i;
if(StrEmpty(T))
return error;
i=Index(S,T,1);
while(i!=0)
{
StrDelete(S,i,StrLength(T));
StrInsert(S,i,V);
i+=StrLength(V);
i=Index(S,T,i);
}
return ok;
}
15.输出串
//输出串S
void StrPrint(HString S)
{
int i;
if(StrEmpty(S))
printf("S为空串,不可输出!");
for(i=0;i
16.主函数测试,只调用了主要的几个函数,其余函数也可以自行验证
//主函数
int main()
{
HString S,T,V;
InitString(T);InitString(S);InitString(V);
printf("***************************\n");
printf("从键盘输入两串字符(分别为字符串1,2):\n");
char str1[Max]; gets(str1);
char str2[Max]; gets(str2);
printf("***************************\n");
printf("实现两串字符的连接: ");
StrAssign(S,str1);StrAssign(T,str2);
Concat( V,S, T);
StrPrint(V);
printf("\n********************************\n");
printf("\n对字符串1进行删除操作:\n");
int pos,len;
printf("输入你想删除的位置和长度:");
scanf("%d%d",&pos,&len);
StrDelete(S, pos, len);
StrPrint(S);
printf("********************************\n");
printf("\n将串2插入到修改后的串1的某个位置:\n");
printf("输入你想插入的位置:");
scanf("%d",&pos);
StrInsert(S, pos, T);
StrPrint(S);
printf("********************************\n");
printf("\n求串3的子串:\n");
printf("输入你想取的子串的起始位置和长度:");
scanf("%d%d",&pos,&len);
HString Sub;
SubString(Sub,V, pos, len);
StrPrint(Sub);
printf("********************************\n");
printf("\n清空并释放串指针\n");
ClearString(S);
ClearString(V);
ClearString(T);
printf("\n程序结束!\n");
return 0;
}