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 ...
随机推荐
- css中的浮动与定位
传送门:https://www.cnblogs.com/junwuyao/p/7435257.html
- nmcli 配置ip
配置ip: nmcli connection modify 'Wired connection 1' connection.autoconnect yes ipv4.method manual ipv ...
- macos下如何解决无法写ntfs格式的u盘或硬盘?
答:macos原生支持,可以通过脚本卸载再重新挂载为可读写即可,脚本在此
- Java基础 Scanner 使用nextLine接收字符串
JDK :OpenJDK-11 OS :CentOS 7.6.1810 IDE :Eclipse 2019‑03 typesetting :Markdown code ...
- flutter Dismissible 可以在拖动时隐藏的widget
import 'package:flutter/material.dart'; class DismissedAppPage extends StatefulWidget { @override St ...
- ISO/IEC 9899:2011 条款6.8.3——表达式与空语句
6.8.3 表达式与空语句 语法 1.expression-statement: expressionopt ; 语义 2.在一条表达式语句中的表达式被计算为一个void表达式作为其副作用.[注 ...
- Ubuntu18.04 instsall XMind_8 and crack
1.dowload XMind_8 linux install zip wget https://www.xmind.cn/xmind/downloads/xmind-8-update8-linux. ...
- LODOP判断没成功发送任务-重打一下
一般情况下打印执行了PRINT()或PRINTA(),就会加入打印机队列,如果打印机脱机,就会在队列里排队,当打印机连上并取消脱机的时候,正在排队的任务就会打出,所以一般建议用是否加入队列来判断打印成 ...
- css 颜色混合模式 mix-blend-mode
CSS3 新增了一个很有意思的属性 -- mix-blend-mode ,其中 mix 和 blend 的中文意译均为混合,那么这个属性的作用直译过来就是混合混合模式,当然,我们我们通常称之为混合模式 ...
- JMC(Java Mission Control)在mac下无法启动和显示界面
错误 `org.eclipse.swt.layout.griddata cannot be cast to org.eclipse.swt.layout.filldata` 解决 来源 注意 根据自己 ...