串(string)是由零个或多个字符组成的有限序列。
含零个字符的串称为空串。
子串:一个串中任意个连续字符组成的序列称为该串的子串。
子串的个数:n(n+1)/2+1
子串的位置:子串的第一个字符在主串的序号。
注:区分空串与空白串:
空白串长度不为零,串中有若干空格
与线性表一样,串也有顺序存储结构与链式存储结构,前者简称顺序串,后者简称链式串。
顺序串的存储方式有两种:
1. 非紧缩格式(其存储密度小),每个字存储一个字符,比较浪费存储空间,但处理单个字符或一组连续字符方便。
2.紧缩格式(其存储密度大),每个字存储多个字符,比较节省存储空间,但处理单个字符不太方便,运算效率低。
我们主要讨论前者,非紧缩格式的顺序串,类型声明如下:
#define MAXSIZE 128
typedef struct
{
char data[MAXSIZE];//存储字符串
int length;//存储长度
}SQString;
完整代码如下:
#include <stdio.h>
#define MAXSIZE 128
typedef struct
{
char data[MAXSIZE];//存储字符串
int length;//存储长度
}SQString;
/*
1.生成串
*/
void StrAssign(SQString* s,char *t) // '\0'是字符串的结束标志
{
int i;
//值
i=0;
while(t[i]!='\0')
{
(*s).data[i]=t[i];
i=i+1;
}
//长度
(*s).length=i;
}
/*
2.串复制
*/
int StrCopy(SQString *s,SQString *t)
{
int i;
for(i=0;i<=(*t).length-1;i++)
{
(*t).data[i] = (*s).data[i];
}
(*t).length = (*s).length;
}
/*
3.判断串是否相等
若相等,返回1;否则,返回0
*/
int StrEqual(SQString s,SQString t)
{
int i;
if(s.length==t.length)
{
for(i=0;i<=s.length-1;i++)
{
if(s.data[i]!=t.data[i])
{
return 0; //长度相等的串中有对应字符不相同
}
}
return 1;
}
return 0; //长度不相等
}
/*
4.求长度
*/
int StrLength(SQString s)
{
return s.length;
}
/*
5.字符串连接
*/
SQString Concat(SQString s,SQString t)
{
SQString str; //定义结果串
int i;
//值
for(i=0;i<=s.length-1;i++)
{
str.data[i]=s.data[i]; //将s.data[0...s.length-1]复制到str
}
for(i=0;i<=t.length-1;i++)
{
str.data[s.length+i]=t.data[i]; //将t.data[0...t.length-1]复制到str
}
//长度
str.length=s.length+t.length;
return str;
}
/*
6.求子串
在字符串s中,把从第i个字符开始连续的j个字符形成的子串存储到*t中
参数合法:i>=1&&j>=0&&(i+j-2)<=(s.length-1)
若参数合法,进行操作,返回1;
否则,提示,返回0
*/
int SubStr(SQString s,int i,int j,SQString *t)
{
int k;
if(i>=1&&j>=0&&(i+j-2)<=(s.length-1))
{
//值
for(k=0;k<=j-1;k++)
{
(*t).data[k]=s.data[k+(i-1)];
}
//长度
(*t).length=j;
return 1;
}
else
{
printf("参数错误!\n");
return 0;
}
}
/*
7.添加
参数合法:i>=1&&i<=s.length+1
若参数合法,进行操作,返回1;
否则,提示,返回0
*/
int InsStr(SQString *s,int i,SQString t)
{
int j;
if(i>=1&&i<=(*s).length+1)
{
//往后移动t.length位置
for(j=(*s).length-1;j>=i-1;j--)
{
(*s).data[j+t.length]=(*s).data[j];
}
//值
for(j=0;j<=t.length-1;j++)
{
(*s).data[j+(i-1)]=t.data[j];
}
//长度
(*s).length=(*s).length+t.length;
return 1;
}
else
{
printf("参数错误!\n");
return 0;
}
}
/*
9.删除
参数合法:i>=1&&j>=0&&(i+j-2)<=(s.length-1)
若参数合法,进行操作,返回1;
否则,提示,返回0
*/
int DelStr(SQString *s,int i,int j,SQString *t)
{
int k;
if(i>=1&&j>=0&&(i+j-2)<=((*s).length-1))
{
//把要删除的子串存储到*t中
for(k=0;k<=j-1;k++)
{
(*t).data[k]=(*s).data[k+(i-1)];
}
(*t).length=j;
//移动删除
for(k=i+j-1;k<=(*s).length-1;k++)
{
(*s).data[k-j]=(*s).data[k];
}
//长度
(*s).length=(*s).length-j;
return 1;
}
else
{
printf("参数错误!\n");
return 0;
}
}
/*
9.替换
(1). j==t.length 不移动
(2).j>t.length 前移j-t.length
(3).j<t.length 后移t.lenthg-j
*/
int RepStr(SQString *s,int i,int j,SQString t)
{
int k;
if (j=t.length)
{
for(k=0;k<t.length;k++)
(*s).data[i-1]=t.data[k];
}
else
{
if(j>t.length)
{
for(k=0;k<t.length;k++)
(*s).data[i-1]=t.data[k];
}
else
{
if(j<t.length)
{
for(k=0;k<j;k++)
(*s).data[i-1]=t.data[k];
}
}
}
(*s).length=(*s).length-j+t.length;
}
/*
10.输出
*/
void DispStr(SQString s)
{
int i;
printf("字符串为:");
for(i=0;i<=s.length-1;i++)
{
printf("%c",s.data[i]);
}
printf("\n");
}
int main()
{
SQString s;
char *t;
t="Hello ABC";
StrAssign(&s,t); //串赋值
DispStr(s); // 输出串的元素
return 1;
}