一般表示为

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;
}

 

01-15 02:14