c语言实现串
串 (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语言实现串的更多相关文章
- Inno Setup:获取isl中的多国语言字串
原文 http://zwkufo.blog.163.com/blog/static/25882512010101041626803/?suggestedreading&wumii 用InnoS ...
- C语言 · 字串逆序
算法训练 字串逆序 时间限制:1.0s 内存限制:512.0MB 问题描述 给定一个字符串,将这个串的所有字母逆序后输出. 输入格式 输入包含一个字符串,长度不超过100,字符串中不 ...
- C语言 · s01串
算法训练 s01串 时间限制:1.0s 内存限制:256.0MB 问题描述 s01串初始为"0" 按以下方式变换 0变1,1变01 输入格式 1个整数(0~19) ...
- c语言字串指针 char*
c语言中 char* 不仅能存字符串,还能存二进制数据,所以它的用途因使用者而定. char* 在很多使用场景下,是需要存储ascii码为0的元素的,这样就必须注意一个问题,那就是char*的长度. ...
- KOTLIN开发语言文档(官方文档) -- 2.基本概念
网页链接:https://kotlinlang.org/docs/reference/basic-types.html 2. 基本概念 2.1. 基本类型 从可以在任何变量处理调用成员函数和属性 ...
- Delphi String 常用字串符处理函数
Delphi 在面对跨平台开发,程序语言也改进不少,不过有些改进,让原本 Delphi 开发者有些不适应,最显注的就是字串处理函数了,原本 Pascal 语言字串起始由 1 开始,几乎是它的经典了,新 ...
- Python有哪些好用的语言翻译方法
最近有个需求,要将几万条数据从日语翻译成中文.因为数据的获取和处理用的是python代码,所以想先尝试翻译部分也用python实现. 目前网上查到的翻译方法有百度.有道云以及谷歌翻译,下面会对这三个方 ...
- 串、串的模式匹配算法(子串查找)BF算法、KMP算法
串的定长顺序存储#define MAXSTRLEN 255,//超出这个长度则超出部分被舍去,称为截断 串的模式匹配: 串的定义:0个或多个字符组成的有限序列S = 'a1a2a3…….an ' n ...
- Linux快速上手
1.Linux系统架构 内核(kernel) 内存管理(mm) Linux内存特性无论物理内存有多大,Linux 都将其充份利用,将一些程序调用过的硬盘数据读入内存,利用内存读写的高速特性来提高Lin ...
随机推荐
- Python 画 直方图/条形图/柱状图
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/u011489887/article/de ...
- Dynamic Filter Networks
Dynamic Filter Networks 2019-06-10 11:29:19 Paper:http://papers.nips.cc/paper/6578-dynamic-filter-ne ...
- phpstorm 使用xdebug断点
1.下载对应版本 xdebug 下载地址:https://download.csdn.net/download/q2104574/11185239 比如你用的php7.0.12以上的版本,xdebug ...
- HmacSHA256摘要算法
mac(Message Authentication Code,消息认证码算法)是含有密钥散列函数算法,兼容了MD和SHA算法的特性,并在此基础上加上了密钥. 甲乙双方进行数据交换可以采取如下流程完成 ...
- GIS地理工具案例教程——批量合并影像
GIS地理工具案例教程——批量合并影像 商务合作,科技咨询,版权转让:向日葵,135—4855__4328,xiexiaokui#qq.com 描述:合并目录下的所有影像 功能:对指定工作空间下的栅格 ...
- post请求头中常见content-type(非常重要)
定义和用法 enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码.默认地,表单数据会编码为 "application/x-www-form-urlencoded". ...
- tomcat中设置Java 客户端程序的http(https)访问代理
1.假定http/https代理服务器为 127.0.0.1 端口为8118 2.在tomcat/bin/catalina.sh脚本文件中设置JAVA_OPTS,如下图: 保存后重启tomcat就能生 ...
- tomcat的AJP(定向包协议)协议
由于tomcat的html和图片解析功能相对其他服务器如apche等较弱,所以,一般都是集成起来使用,只有jsp和servlet服务交由tomcat处理,而tomcat和其他服务器的集成,就是通过aj ...
- ubuntu二进制包安装openresty
date: 2019-08-01 17:59:59 author: headsen chen # 导入我们的 GPG 密钥: wget -qO - https://openresty.org/pack ...
- [转]linux 下 使用 c / c++ 调用curl库 做通信开发
example: 1. http://curl.haxx.se/libcurl/c/example.html 2. http://www.libcurl.org/book: 1. http:/ ...