串:

串(string)是由零个或多个字符组成的有限序列,又名叫字符串。 
串一般记为。用双引号或单引号括起来的字符序列是串的值(引号不属于串的内容)。所谓的序列,说明串的相邻字符之间具有前驱和后继的关系。 
几种特殊的串 

空串(nullstring):零个字符的串,它的长度为零,可以直接用两双引号“""”表示,也可以用希腊字母“Φ”来表示。
空格串:只包含空格的串。 
子串与主串:串中任意个数的连续字符组成的子序列称为该串的子串,相应地,包含子串的串称为主串。子串在主串中的位置就是子串的第一个字符在主串中的序号。
串的比较是通过组成串的字符之间的编码来进行的,而字符的编码指的是字符在对应字符集中的序号。 
目前计算机常用的编码方式为标准的ASCII编码,由7位二进制数表示一个字符,总共可以表示128个字符。后来发现一些特殊符号的出现,128个不够用,于是扩展ASCII码由8位二进制数表示一个字符,总共可以表示256个字符,这已经足够满足以英语为主的语言和特殊符号进行输入、存储、输出等操作的字符需要了。 
全世界有成百上千种语言与文字,显然这256个字符是不够的,因此后来就有了Unicode编码,比较常用的是由16位的二进制数表示一个字符,这样总共就可以表示个字符,约是6.5万多个字符,足够表示世界上所有语言的所有字符了。为了和ASCII码兼容,Unicode的前256个字符与ASCII码完全相同。串的比较是通过组成串的字符之间的编码来进行的,而字符的编码指的是字符在对应字符集中的序号。 
串的基本操作代码如下:

头文件:

#define SIZE 100
typedef struct Str
{
 char elem[SIZE];
 int length;//字符串有效长度
}Str;
//功能函数
void StrAssign(Str*s, const char *chars);///
void StrCpy(Str*s, Str *t);
void show(Str *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);
bool DeletePos(Str*s, int pos, int len);//从pos位置开始删除len长度
bool Delete(Str*s, int pos, Str*t);//从pos位置删子串t
bool Replace(Str*s, Str *t, Str*v, int pos);//用v替换从pos位置开始的第一个
bool ReplaceAll(Str *s, Str *t, Str*v);

Str.cpp
#include<stdio.h>
#include<assert.h>
#include<string.h>
#include"Str.h"

void StrAssign(Str *s,const char *chars)//初始化
{
 assert(s != NULL);
 int len = strlen(chars);
 if (len > SIZE)
 {
  return;
 }
 for (int i = 0; i < len; i++)
 {
  s->elem[i] = chars[i];
 }
 s->length = len;
}
void StrCpy(Str *s, Str*t)//串t 拷贝到s
{
 assert(s!= NULL&& t!=NULL);
 for (int i = 0; i < t->length; i++)
 {
  s->elem[i] = t->elem[i];
 }
 s->length = t->length;
}
void show(Str *s)//show
{
 for (int i = 0; i < s->length; i++)
 {
  printf("%c", s->elem[i]);
 }
 printf("\n");
}
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中。且空白不提取
{
 assert(sub != NULL&& s != NULL);
 if (pos < 0 || len<=0||pos+len>s->length-1|| pos>=s->length)
 {
  return false;
 }
 for (int i =0; i <= len;i++)
 {
  sub->elem[i] = s->elem[i+pos];
 }
 sub->length = len;
 return true;
}
bool Insert(Str*s, int pos, Str*t)//在pos位置插入字符串t
{
 assert(s != NULL&& t != NULL);
 int lens = GetLength(s);
 int lent = GetLength(t);
 if (pos < 0||lens+lent>SIZE||pos>=s->length)
 {
  return false;
 }
 for (int i =lens-1; i > pos ; --i)//挪数据
 {
  s->elem[i + lent] = s->elem[i];
 }
 for (int i = 0; i < lent; i++)
 {
  s->elem[pos + i] = t->elem[i];
 }
 s->length += t->length;
}
int BF(Str*s, Str*sub, int pos)//
{
 if (pos<0 || pos>s->length)
 {
  return -1;
 }
 int i = pos;
 int j = 0;
 int lens = GetLength(s);
 int lensub = GetLength(sub);
 while (i < lens&&j < lensub)
 {
  if (s->elem[i] == sub->elem[j])
  {
   i++;
   j++;
  }
  else
  {
   i = i - j + 1;
   j = 0;
  }
 }
 if (j >= lensub)
 {
  return i - j;
 }
 else
 {
  return -1;
 }
}
bool DeletePos(Str*s, int pos, int len)//从pos位置开始删除len长度
{
 assert(s != NULL);
 if (pos <0 || len > s->length || pos+len>s->length||len<0)
 {
  return false;
 }
 for (int i = pos; i < s->length - len; i++)
 {
  s->elem[i] = s->elem[i+len];
 }
 s->length -= len;
 return true;
}
bool Delete(Str*s, int pos, Str*t)//从pos位置删子串t
{
 int index = BF(s, t, pos);//找子串
 if (index < 0)
 {
  return false;
 }
 return DeletePos(s, index, t->length);
}
bool Replace(Str*s, Str *t, Str*v, int pos)//用v替换从pos位置开始的第一个
{
 assert(s != NULL || t != NULL || v != NULL);
 int index = BF(s, t, pos);
 if (index < 0)
 {
  return false;
 }
 DeletePos(s, index, t->length);
 return Insert(s, index, v);
}
bool ReplaceAll(Str *s, Str *t, Str*v)//全替换
{
 while (Replace(s, t, v, 0));
 return true;
}

测试用例:
test.cpp
#include<stdio.h>
#include<string.h>
#include"Str.h"
int main()
{
 Str s;
 char *s1 = "iloveyouandyouloveme";
 StrAssign(&s,s1);
 show(&s);
 int len1 = GetLength(&s);
 printf("字符串1长度:%d\n", len1);
 Str t;
 char *s2 = "love";
 StrAssign(&t,s2);
 show(&t);
 int len2 = GetLength(&t);
 printf("字符串2长度:%d\n", len2);
 
 /*Str s3;
 SubStr(&s3, &s, 2, 5);
 show(&s3);
 Insert(&s,3, &t);
 show(&s);
    //StrCpy(&s, &t);
 //show(&s);
 int bf = BF(&s, &t, 5);
 printf("bf:%d\n", bf);
 DeletePos(&s, 5, 10);
 show(&s);
 Delete(&s, 5, &t);
 show(&s);*/
 Str s3;
 char *p = "oooo";
 StrAssign(&s3, p);
 show(&s3);
 Replace(&s, &t, &s3, 5);
 printf("替换为:");
 show(&s);
 
 ReplaceAll(&s, &t, &s3);
 printf("全替换为:");
 show(&s);
 return 0;
}
运行结果:数据结构-串


相关文章:

  • 2021-08-16
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-11-18
  • 2022-12-23
  • 2021-08-01
猜你喜欢
  • 2021-04-22
  • 2021-07-31
  • 2022-12-23
  • 2021-09-25
相关资源
相似解决方案