1.串的定义
串(String)是零个或多个字符组成的有限序列。一般记作:S=“a1a2a3…an”,
其中,S是串名; “a1a2a3…an”是串值;ai(1≤i≤n)可以是字母、数字或其它字符;
串的长度:串中所包含的字符个数;
空串:长度为零的串称为空串(Empty String),它不包含任何字符。
空白串: 通常将仅由一个或多个空格组成的串称为空白串(Blank String)。
注意:空串和空白串的不同。
2.串的基本运算(抽象运算)
串赋值: StrAssign(&S, chars)
串比较: StrCompare(S, T)
求串长: StrLength(S)
串联接: Concat(&T,S1,S2)
求子串: SubString(&sub, S, pos, len)
串复制 : StrCopy(&T,S)
子串定位: Index(S,T,pos)
3. 串的表示(定长存储和堆存储)
定长顺序存储
typedef struct{
char ch[MaxStrlen];
int length;
}SqString;
堆分配存储:
typedef struct{
char *ch;
int length;
}Hstring;
4.串基本运算的代码实现
1.定义串结构体,以堆分配的存储方式
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>#define Max 20
#define error 0
#define overflow -2
#define ok 1
#define true 1
#define false 0typedef 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<i;j++)T.ch[j]=str[j];T.length=i;}
}
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<S.length;i++)T.ch[i]=S.ch[i];T.length=S.length;return ok;
}
6.串比较
//串比较
Status StrCmp(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 0;
}
7.求串长
Status StrLength(HString S)
{if(StrEmpty(S))return error;elsereturn 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<S1.length;i++)T.ch[i]=S1.ch[i];for(i=0;i<S2.length;i++)T.ch[S1.length+i]=S2.ch[i];return ok;
}
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<len;i++)Sub.ch[i]=S.ch[pos+i-1];Sub.length=len; }return ok;
}
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++;elsereturn 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<T.length;i++)S.ch[pos+i-1]=T.ch[i];S.length+=T.length; }return ok;
}
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<S.length;i++)printf("%c",S.ch[i]); printf("\n");
}
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;}
5.程序截图