一、代码如下
/*
项目名称:顺序串的建立与基本操作
编译环境:VC++ 2008
作者相关:。。。
最后修改:2019.6.29
学习目标:赋值、复制、判空、比较、求长、清空、连接、返回子串、
返回子串下标、替换子串、删除子串、销毁
注意事项:1.测试所有功能是否正常
*/
#include <stdio.h>
#include <string.h>
#define ERROR 0
#define OK 1
#define MAXSTRLEN 255
typedef bool Status;
typedef unsigned char String[MAXSTRLEN+1];//0号单元存放串的长度
Status StrAssign(String &T,const char *s);
Status StrCopy(String &T,String S);
Status StrEmpty(String S);
int StrCompare(String S,String T);
int StrLength(String S);
Status ClearString(String &S);
Status Concat(String &T,String S1,String S2);//用T返回由S1和S2连接而成的新串
Status SubString(String &Sub,String S,int pos,int len);
int Index(String S,String T,int pos);
Status Replace(String &S,String T,String V);
Status StrMoveEnd(String &S,int pos,int i);
Status StrInsert(String &S,int pos,String T);
Status StrMoveFront(String &S,int pos,int i);
Status StrDelete(String &S,int pos,int len);
Status StrOut(String S);
int main()
{
String T1;
const char *s = "hello data structure!";
StrAssign(T1,s);
printf("T1");
StrOut(T1);
String T2;
StrCopy(T2,T1);
printf("T2");
StrOut(T1);
if(StrEmpty(T1))
printf("T1为空!\n\n");
else
printf("T1非空!\n\n");
int k = StrCompare(T1,T2);
if(k>0)
printf("T1大于T2!\n\n");
else if(k<0)
printf("T1小于T2!\n\n");
else
printf("T1等于T2!\n\n");
String T;
Concat(T,T1,T2);
printf("T");
StrOut(T);
String Sub,Sub2;
SubString(Sub,T1,7,4);
printf("Sub");
StrOut(Sub);
int j = Index(T1,Sub,2);
printf("Sub在T1串第2个位置后第一次出现的位置是: %d\n\n",j);
SubString(Sub2,T1,1,4);
Replace(T1,Sub,Sub2);
printf("替换后的字符串T1");
StrOut(T1);
StrInsert(T2,4,Sub);
printf("插入后的T2");
StrOut(T2);
StrDelete(T1,1,5);//删除前5个字符
printf("删除后的T1");
StrOut(T1);
return 0;
}
Status StrAssign(String &T,const char *s)
{
int i;
if(strlen(s)>MAXSTRLEN)
return ERROR;
else
{
T[0]=strlen(s);
for(int i=0;i<T[0];i++)
T[i+1]=s[i];
return OK;
}
}
Status StrCopy(String &T,String S)
{
for(int i=0;i<=S[0];i++)
T[i]=S[i];
return OK;
}
Status StrEmpty(String S)
{
if(S[0]==0)
return true;
else
return false;
}
int StrCompare(String S,String T)
{
int i;
for(i=1;i<=S[0]&&i<=T[0];i++)//这样就确定了长度最短的字符串,也可两者相等
if(S[i]!=T[i])
return S[i]-T[i];//S小则返回负数,S大则返回正数
else
return S[0]-T[0];//直到某个字符串结束,比较的字符全部相同,现在比较长度
}
int StrLength(String S)
{
return S[0];
}
Status ClearString(String &S)
{
S[0]=0;
return OK;
}
Status Concat(String &T,String S1,String S2)
{
if(S1[0]+S2[0]<=MAXSTRLEN)
{
for(int i=1;i<=S2[0];i++)
S1[S1[0]+i] = S2[i];
S1[0]+=S2[0];
StrCopy(T,S1);
}
else if(S1[0]<MAXSTRLEN)//截断S2
{
for(int i=1;i<=MAXSTRLEN-S1[0];i++)
S1[S1[0]+i] = S2[i];
S1[0]=MAXSTRLEN;
StrCopy(T,S1);
}
else
{
StrCopy(T,S1);//S1已达到最大长度
}
return OK;
}
Status SubString(String &Sub,String S,int pos,int len)
{
if(pos>=1&&pos<=S[0]&&len>=0&&len<=S[0]-pos+1)
{
for(int i=1;i<=len;i++)
Sub[i]=S[pos+i-1];
Sub[0]=len;
}
else
return ERROR;
return OK;
}
int Index(String S,String T,int pos)
{
String Sub;
if(pos>=1&&pos<=S[0])
{
for(int i=1;i<=S[0]-T[0]+1;i++)
{
SubString(Sub,S,i,T[0]);
if(!StrCompare(Sub,T))
{
if(i>pos)
return i;
else
return 0;
}
}
}
}
Status Replace(String &S,String T,String V)
{
String Sub;
for(int i=1;i<=S[0]-T[0]+1;i++)
{
int j=1,k; //每一次循环对j要重新赋值
SubString(Sub,S,i,T[0]);
if(!StrCompare(Sub,T))
{
k=i;
while(j<=T[0])
{
S[k]=V[j];
++k;
++j;
}
}
}
return OK;
}
Status StrMoveEnd(String &S,int pos,int i)//从pos开始字符串向后移动i个单位
{
for(int j=S[0];j>=pos;j--)//因为该函数被插入函数调用,在这里假设pos合法
S[j+i]=S[j];
return OK;
}
Status StrInsert(String &S,int pos,String T)
{
if(pos<1||pos>S[0]+1)
return ERROR;
else
{
StrMoveEnd(S,pos,T[0]);
for(int i=1;i<=T[0];i++)
S[pos+i-1]=T[i];
}
return OK;
}
Status StrMoveFront(String &S,int pos,int len)
{
for(int i=pos;i<=S[0]-len;i++)
S[i]=S[i+len];
return OK;
}
Status StrDelete(String &S,int pos,int len)
{
if(StrEmpty(S)||pos<1||pos>S[0]-len+1)
return ERROR;
else
StrMoveFront(S,pos,len);
return OK;
}
Status StrOut(String S)
{
printf("串内容: ");
for(int i=1;i<=S[0];i++)
{
printf("%c",S[i]);
}
printf("\n\n");
return OK;
}
二、效果
![](https://i-blog.csdnimg.cn/blog_migrate/00c20190183db0d64d5bf2e7b63ccb5a.png)