串  (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. 第十四周助教工作总结——NWNU李泓毅

    助教博客链接:https://www.cnblogs.com/NWNU-LHY/ 本次作业的要求:团队项目需求改进与系统设计:https://www.cnblogs.com/nwnu-daizh/p/ ...

  2. Spring 源码学习之环境搭建

    一.下载Spring 源码 进入 https://github.com/spring-projects/spring-framework/tags 选择下载spring freamework的版本 h ...

  3. c++ 函数后面加一个冒号的含义

    转载自:https://zhidao.baidu.com/question/2010930169328038188.html 冒号后面跟的是赋值,这种写法是C++的特性. A( int aa, int ...

  4. 批量管理工具:pssh/ansible

    ssh 免密码 批量管理1.创建用户useradd user1echo “123456”| passwd --stdin user12.创建秘钥ssh-keygen -t dsa然后一直回车 非交互式 ...

  5. Android 调用WCF实例详解

    上篇文章已经对Web Service及其相关知识进行了介绍(Android开发之WebService介绍 ),相信有的朋友已经忍耐不住想试试在Android应用中调用Web Service.本文将通过 ...

  6. Java基础 if if-else if-else if-else 三种示例

        JDK :OpenJDK-11      OS :CentOS 7.6.1810      IDE :Eclipse 2019‑03 typesetting :Markdown   code ...

  7. Flutter页面跳转返回数据

    Dart中的异步请求和等待和ES6中的方法很像,直接使用async...await就可以实现. 核心代码: _navigateToAddress(BuildContext context) async ...

  8. logrotate机制&原理

    logrotate机制&原理 centos系统中默认安装logrotate,logrotate主配置文件:/etc/logrotate.conf,其中定义了系统默认的logrotate规则,当 ...

  9. 008-SpringBoot发布WAR启动报错:Error assembling WAR: webxml attribute is required

    一.Spring Boot发布war包流程: 1.修改web model的pom.xml <packaging>war</packaging> SpringBoot默认发布的都 ...

  10. 123457123457#0#----com.MC.3or1KongLongPT867----前拼后广--3or1恐龙PtGame-mc

    com.MC.3or1KongLongPT867----前拼后广--3or1恐龙PtGame-mc