c语言实现串
2024-08-26 22:01:18
串 (string)是由零个或者多个字符组成的有限序列,又称字符串
一般表示为
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=;
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=;
for(;i<t->length;i++)
{
s->elem[i]=t->elem[i];
}
s->length=t->length;
}
bool IsEmpty(Str *s)// 判断是否空串
{
return s->length==;
}
int GetLength(Str *s)// 返回串的长度
{
return s->length;
}
void Clear(Str *s)// 清空串
{
s->length=;
}
bool SubStr(Str *sub,Str *s,int pos,int len)// 从s 里面的pos 位置提取长度为len 的子串 放到sub里面
{
if(pos<||len<||pos>s->length||len>sub->length||len>s->length)
{
return false;
}
int i=;
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<||pos>s->length||t->length+s->length>SIZE)
{
return false;
}
int i=s->length-;
for(;i>=pos;i--)
{
s->elem[i+t->length]=s->elem[i];
}
for(i=;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<||pos>s->length)
{
return -;
}
int i=pos,j=;
while(i<s->length&&j<sub->length)
{
if(s->elem[i]==sub->elem[j])
{
i++;
j++;
}
else
{
i=i-j+;
j=;
}
}
if(j>=sub->length)
{
return i-j;
}
else
{
return -;
}
}
bool DeletePos(Str *s,int pos,int len)// 从s 的pos 位置删除len 个长度
{
if(pos<||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()
{
if(Replace(s,t,v,));
else
{
break;
}
}
return true;
}
void show(Str *s)
{
int i=;
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 ;
}
最新文章
- PPT开发 * .pps 文件类型
- go sample-base64
- loj 1011(状态压缩+记忆化搜索)
- 修改SR4000自带软件,支持opencv
- Netflix工程总监眼中的分类算法:深度学习优先级最低
- HTML5 ArrayBuffer:类型化数组 (二)
- C++中引用用于结构
- Apache JMeter - load test tool
- WINDOWS程序设计对话框加载显示bmp图像及刷新
- FJUT第三周寒假作业《第九集,离间计》栈
- NOI2019十二省联考旅游记
- Django Form表单组件
- [双系统linux] ----双系统切换导致系统时间错误
- git 琐碎
- Linux在终端和控制台下复制粘贴命令快捷键
- NAT地址转换
- TreeView添加treeView1_NodeMouseClick----多么痛的领悟。。。
- MySQL分页存储过程
- 2017 Bangladesh National High School Programming Contest ( National Round, Senior Group ), NHSPC 2017 题解
- 代码收藏系列--javascript--移动端技巧