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

 

c语言实现串的更多相关文章

  1. Inno Setup:获取isl中的多国语言字串

    原文 http://zwkufo.blog.163.com/blog/static/25882512010101041626803/?suggestedreading&wumii 用InnoS ...

  2. C语言 · 字串逆序

    算法训练 字串逆序   时间限制:1.0s   内存限制:512.0MB      问题描述 给定一个字符串,将这个串的所有字母逆序后输出. 输入格式 输入包含一个字符串,长度不超过100,字符串中不 ...

  3. C语言 · s01串

    算法训练 s01串   时间限制:1.0s   内存限制:256.0MB      问题描述 s01串初始为"0" 按以下方式变换 0变1,1变01 输入格式 1个整数(0~19) ...

  4. c语言字串指针 char*

    c语言中 char* 不仅能存字符串,还能存二进制数据,所以它的用途因使用者而定. char* 在很多使用场景下,是需要存储ascii码为0的元素的,这样就必须注意一个问题,那就是char*的长度. ...

  5. KOTLIN开发语言文档(官方文档) -- 2.基本概念

    网页链接:https://kotlinlang.org/docs/reference/basic-types.html 2.   基本概念 2.1.  基本类型 从可以在任何变量处理调用成员函数和属性 ...

  6. Delphi String 常用字串符处理函数

    Delphi 在面对跨平台开发,程序语言也改进不少,不过有些改进,让原本 Delphi 开发者有些不适应,最显注的就是字串处理函数了,原本 Pascal 语言字串起始由 1 开始,几乎是它的经典了,新 ...

  7. Python有哪些好用的语言翻译方法

    最近有个需求,要将几万条数据从日语翻译成中文.因为数据的获取和处理用的是python代码,所以想先尝试翻译部分也用python实现. 目前网上查到的翻译方法有百度.有道云以及谷歌翻译,下面会对这三个方 ...

  8. 串、串的模式匹配算法(子串查找)BF算法、KMP算法

    串的定长顺序存储#define MAXSTRLEN 255,//超出这个长度则超出部分被舍去,称为截断 串的模式匹配: 串的定义:0个或多个字符组成的有限序列S = 'a1a2a3…….an ' n ...

  9. Linux快速上手

    1.Linux系统架构 内核(kernel) 内存管理(mm) Linux内存特性无论物理内存有多大,Linux 都将其充份利用,将一些程序调用过的硬盘数据读入内存,利用内存读写的高速特性来提高Lin ...

随机推荐

  1. 分库分表 or NewSQL数据库?终于看懂应该怎么选!【转】

    最近与同行科技交流,经常被问到分库分表与分布式数据库如何选择,网上也有很多关于中间件+传统关系数据库(分库分表)与NewSQL分布式数据库的文章,但有些观点与判断是我觉得是偏激的,脱离环境去评价方案好 ...

  2. MD5与SHA1

    一.MD5 MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于 ...

  3. 5+app uni-app flutter

    5+app uni-app flutter三者区别是什么? - 知乎 https://www.zhihu.com/question/295107584/answer/525442299 崔红保 DCl ...

  4. MyBatis 示例之存储过程

    存储过程在数据库中比较常见,虽然大多数存储过程比较复杂,但是使用 MyBatis 调用时,用法都一样,因此我们这一节使用一个简单的存储过程来了解 MyBatis 中存储过程的使用方法. 基本准备 存储 ...

  5. Oracle 查询表的索引包含的字段

    Oracle 查询表的索引包含的字段 select a.uniqueness 索引类型,b.index_name 索引名称,b.column_name 字段 from user_indexes a , ...

  6. c++ 标准 字符串转换为时间 时间大小比较 判断有效期 简洁办法

    c# php delphi java 等各种语言 对字符串转换为日期 然后与当前日期进行比较 是非常容易的 因为有现成的函数可用 标准 c++ 硬是找不到 合适的代码可用 于是 百度了很多 没百出个结 ...

  7. Mac 快速进入mysql命令行

    1.终端输入进入bin 目录 cd /usr/local/mysql/bin/ 2.mysql登录,输入密码即可 ./mysql -uroot -p 前提:mysql 服务已启动

  8. centos和windows添加路由命令记录

    # 默认路由做香港出口route add default gw 192.168.10.33route add default gw 192.168.10.1 # 删除默认路由# route del d ...

  9. JAVA 或与非运算符 与(&)、或(|)、异或(^)

    运算步骤: 第一步:.转成二进制,即01表示的数字,如5的二进制为 0000  0101,我用八位表示. 第二步:比较二者位数上的数字 1.与运算符 与运算符用符号“&”表示,其使用规律如下: ...

  10. vs Qt mysql 打包程序 Driver not loaded Driver not loaded

    vs下开发Qt连接mysql程序,开发过程中操作MySQL没有问题,但打包以后安装在别的电脑上发现竟然无法连接MySQL,打包的时候,所需的libmysql.dll等dll文件拷贝到exe同级目录了, ...