长度为n的串的子串数目为n(n+1)/2+1
长度为1的子串有n个,
长度为2的子串有n-1个,
长度为3的子串有n-2个,……,
长度为n的子串有1个,
+空串
5.1定长顺序串
超出预定长度,截断
5.1.1类型构造
#define MAXLEN 20
typedef struct {
char ch[MAXLEN];
int len;
} SString;
5.1.2置空串
StrClear( SString *s )
{
s->len=0;
return(1);
}
5.1.3求串长
int StrLength(SString s)
{
return(s.len);
}
5.1.4判断是否为空串
StrEmpty(SString s)
{
if (s.len==0) return(1);
else return(0);
}
5.1.5复制串
StrCopy(SString * s, SString t)
{
for (i=0;i<=t.len-1;i++)
s->ch[i]=t.ch[i];
s->len=t.len;
}
5.1.6串比较
StrCompare(SString s, SString t){
for(i=0;i<s.len&&i<t.len;i++)
if(s.ch[i]!=t.ch[i])
return(s.ch[i]-t.ch[i]);
if(i==s.len&&s.len==t.len) return 0;//若串s和t相等,则返回0
if(s.len>t.len) return s.ch[i];//若s>t返回正整数
else return 0-t.ch[i];//若s<t返回负整数
}
5.1.7串插入
//在串s第pos个字符前插入串t
int StrInsert(SString *S,int pos,SString T){
if(pos<1||pos>s->len+1) return 0;//首先判断插入位置是否合法
if(s->len+t.len<=MAXLEN) {//两串都无截断情况
//i表示下标
for(i=s->len-1;i>=pos-1;i--)//从s串的最后一个字符往前到第pos个字符,依次后移动t.len个位置
s->ch[i+t.len]=s->ch[i];
for(i=0;i<=t.len-1;i++)//串t插入
s->ch[i+pos-1]=t.ch[i];
s->len=s->len+t.len;//最后别忘了更新串长
}
else if(pos+t.len-1<=MAXLEN){//串t能全部插入,但串s得截断一部分
for(i=MAXLEN-1; i>=pos-1+t.len;i--)
s->ch[i]=s->ch[i-t.len];
for(i=0;i<=t.len-1;i++)
s->ch[i+pos-1]=t.ch[i];
s->len=MAXLEN;
}
else{//串t都不能全部插入
for(i=0;i<=MAXLEN-pos;i++)
s->ch[i+pos-1]=t.ch[i];
s->len=MAXLEN;
}
}
5.1.8删除子串
在串s中删除从第pos个字符起len个字符
首先判断删除是否合法:
因为1<=pos<=s->len 且 pos+len-1<=s->len
所以pos要满足:1<=pos<=s->len-len+1
StrDelete(SString * s,int pos,int len) {
if(pos<1||pos>(s->len-len+1)) return(0);
for(i=pos+len-1;i<=s->len-1;i++)
s->ch[i-len]=s->ch[i];
s->len=s->len-len;
return(1);
}
5.1.9串连接
//分三种情况
StrCat(SString * s, SString t)
{
if(s->len+t.len<=MAXLEN){ //t能完全连接到s后面
for(i=0;i<t.len;i++)
s->ch[i+s->len]=t.ch[i];
s->len+=t.len;
flag=1;
}
else if(s->len<MAXLEN) {//t只能连一部分到s后面
for(i=0;i<MAXLEN-s->len;i++)
s->ch[i+s->len]=t.ch[i];
s->len=MAXLEN; flag=0;
}
else flag=0; //s已满
return(flag);
}
5.1.10求子串
将串s中第pos个字符起,len个字符复制到串sub中
判断是否合法:
1 <= pos <= s.len
1 <=len 且 pos-1+len <= s.len
SubStr(SString *sub,SString s,int pos,int len){
if(pos<1||pos>s.len||len<1||len>s.len-pos+1)
{ sub->len=0; return(0); }
else{
for(i=0;i<len;i++)
sub->ch[i]=s.ch[i+pos-1];
sub->len=len;
return(1);
}
}