一般表示为
S=“ a1 a2 a3 a4 . . . . . an” 其中S 是串名,双引号串起来的是串值,(有些书用单引号)引号本身不属于串值,a1 可以是字母 数字 符号 ,串中的n称为串的长度,零个字符的串称为空串(null string)表示为““””(4个引号) 或者“Φ” 表示,串长度为零。
串中任意个数连续字符组成的串都是主串的字串 例如 S="absjasdaasjlask" (主串) s="sja" ,s="bsjasd" s="Φ",等等都是主串的字串 (空串是任何串的字串)
因此 在串的结构体中 需要存储串的空间 本次使用数组(也可malloc在堆内存中申请)需要一个记载串长度的整型 length (串中长度不包括'\0')
typedef struct Str { char elem[SIZE]; int length;//没有'\0' }Str;
对串的操作函数有
void StrAssign(Str *s,const char *chars) ;// 初始化串 void StrCpy(Str *s,Str *t);// 把t 串拷贝到s 串 bool IsEmpty(Str *s);// 判断是否空串 int GetLength(Str *s);// 返回串的长度 void Clear(Str *s);// 清空串 bool SubStr(Str *sub,Str *s,int pos,int len);// 从s 里面的pos 位置提取长度为len 的子串 放到sub里面 bool Insert(Str *s,int pos,Str *t);// 从pos 位置插入串t int BF(Str *s,Str *sub,int pos);// 从s串中的pos 位置查找是否有与sub 相等的串 返回其下标 bool DeletePos(Str *s,int pos,int len);// 从s 的pos 位置删除len 个长度 bool Delete(Str *s,Str *t,int pos);// 从pos 位置删除子串t bool Replace(Str *s,Str *t,Str *v,int pos);// 用v 替换从pos 位置开始的第一个t bool ReplaceAll(Str *s,Str *t,Str *v);// 将所有的t 替换成v void show(Str *s);
具体实现函数
#include<iostream> #include<stdlib.h> #include<stdio.h> #include<string.h> #include<assert.h> #include<unistd.h> #define SIZE 20 using namespace std; typedef struct Str { char elem[SIZE]; int length;//没有'\0' }Str; void StrAssign(Str *s,const char *chars) // 初始化串, { assert(s!=NULL&&chars!=NULL); int len=strlen(chars); if(len>SIZE) { return; } int i=0; for(;i<len;i++) { s->elem[i]=chars[i]; } s->length=len; } void StrCpy(Str *s,Str *t)// 把t 串拷贝到s 串 { if(t->length>s->length) { return; } int i=0; for(;i<t->length;i++) { s->elem[i]=t->elem[i]; } s->length=t->length; } bool IsEmpty(Str *s)// 判断是否空串 { return s->length==0; } int GetLength(Str *s)// 返回串的长度 { return s->length; } void Clear(Str *s)// 清空串 { s->length=0; } bool SubStr(Str *sub,Str *s,int pos,int len)// 从s 里面的pos 位置提取长度为len 的子串 放到sub里面 { if(pos<0||len<0||pos>s->length||len>sub->length||len>s->length) { return false; } int i=0; for(;i<len;i++) { sub->elem[i]=s->elem[pos+i]; } sub->length=len; return true; } bool Insert(Str *s,int pos,Str *t)// 从pos 位置插入串t { if(pos<0||pos>s->length||t->length+s->length>SIZE) { return false; } int i=s->length-1; for(;i>=pos;i--) { s->elem[i+t->length]=s->elem[i]; } for(i=0;i<t->length;i++) { s->elem[pos+i]=t->elem[i]; } s->length+=t->length; return true; } int BF(Str *s,Str *sub,int pos)// 从s串中的pos 位置查找是否有与sub 相等的串 返回其下标 { if(pos<0||pos>s->length) { return -1; } int i=pos,j=0; while(i<s->length&&j<sub->length) { if(s->elem[i]==sub->elem[j]) { i++; j++; } else { i=i-j+1; j=0; } } if(j>=sub->length) { return i-j; } else { return -1; } } bool DeletePos(Str *s,int pos,int len)// 从s 的pos 位置删除len 个长度 { if(pos<0||pos>s->length||len>s->length-pos) { return false; } int i=pos; for(;i<s->length-len;i++) { s->elem[i]=s->elem[i+len]; } s->length-=len; return true; } bool Delete(Str *s,Str *t,int pos)// 从pos 位置删除子串t { int n=BF(s,t,pos); int len=t->length; bool sign= DeletePos(s,n,len); return sign; } bool Replace(Str *s,Str *t,Str *v,int pos)// 用v 替换从pos 位置开始的第一个t { int n=BF(s,t,pos); bool sign=false; sign=Delete(s,t,pos); if(sign) { Insert(s,n,v); } return sign; } bool ReplaceAll(Str *s,Str *t,Str *v)// 将所有的t 替换成v { while(1) { if(Replace(s,t,v,0)); else { break; } } return true; } void show(Str *s) { int i=0; for(;i<s->length;i++) { printf("%c",s->elem[i]); } } int main() { Str s; Str v; Str t; StrAssign(&s,"abcdefgabcad"); StrAssign(&v,"lllll"); StrAssign(&t,"bc"); // Insert(&s,2,&t); // Delete(&s,&t,2); ReplaceAll(&s,&t,&v); // int n=BF(&s,&t,1); // cout<<n<<endl; show(&s); cout<<endl; return 0; }