串的相关操作(C++描述)

复习一下串的一些相关操作.

文件"mystring.h"

#include<iostream> using namespace std; class My_string { private: char *ch; int length; public: My_string() { ch=NULL; length=0; } char *C_str() { return ch; } void Assign(char chars[]) //初始化串 { //把字符串常量chars[]赋值给串 int i=0,j=0,chars_len=0; while(chars[i]!='\0') { chars_len+=1; i++; } if(!chars_len) { ch=NULL; length=0; } else { i=0; ch=new char[chars_len+1]; while(chars[i]!='\0') ch[j++]=chars[i++]; ch[j]='\0'; length=chars_len; } } int Get_length() { return length; } int Str_cmp(My_string S)//比较两个字符串 { //比较两个字符串的每个字符对应的ASCII码值 int i=0; while(this->ch[i]==S.ch[i]) i++; return (this->ch[i]-S.ch[i]); } void Clear_Str() { if(this->ch) { this->ch=NULL; length=0; } } void Concat_Str(My_string &T,My_string s) //连接字符串 { //用T存储对象和串S连接后的串 int s1_len=this->length; int s2_len=s.Get_length(); T.ch=new char[s1_len+s2_len+1]; int i=0,k=0; while(this->ch[i]!='\0') T.ch[k++]=this->ch[i++]; i=0; while(s.ch[i]!='\0') T.ch[k++]=s.ch[i++]; T.ch[k]='\0'; T.length=s1_len+s2_len; } void Sub_Str(My_string &sub,int pos,int len) //求子串 { //用sub存储从pos开始的长度为len的对象的子串 //其中1<=pos<length,0<=len<=length int s_len=this->length; if(pos<1 || pos>s_len+1 || len<0 || len>length) { cout<<"参数不合法"<<endl; return; } if(!len) { sub.ch=NULL; sub.length=0; } else { sub.ch=new char[len+1]; for(int i=0;i<len;i++) sub.ch[i]=this->ch[i+pos-1]; sub.ch[len]='\0'; sub.length=len; } } void Insert_Str(int pos,My_string T) //插入 { //在第pos个字符之前插入串T int s_len=length; int t_len=T.Get_length(); cout<<"插入的串的长度:"<<t_len<<endl; cout<<"插入前主串的长度:"<<s_len<<endl; if(pos<1 || pos>s_len+1) { cout<<"插入位置不合法"<<endl; return; } char *a=new char[255]; if(t_len) { int i=0,k=0; while(ch[i]!='\0') { a[i]=ch[i]; i++; } a[i]='\0'; delete ch; ch=new char[s_len+t_len+1]; for(i=0,k=0;i<pos-1;i++) ch[k++]=a[i]; int j=0; while(T.ch[j]!='\0') { ch[k]=T.ch[j]; k++; j++; } while(a[i]!='\0') { ch[k]=a[i]; i++; k++; } ch[k]='\0'; length=s_len+t_len; delete a; } } int Index_BF(My_string S,int pos=1) //BF算法模式匹配 { //从pos位置开始进行进行模式匹配 //1<=pos<=length-S.length+1 if(pos<0 || pos>length-S.Get_length()+1) { cout<<"pos参数不合理"<<endl; return -1; } int i=pos-1; int j=0; while(ch[i+j]!='\0' && S.ch[j]!='\0') { if(ch[i+j]==S.ch[j]) j++; else { i++; j=0; } } if(S.ch[j]=='\0') return i+1; else return -1; } void Get_next(int next[]) { //求模式的next函数值并存入数组next中,为后面的模式匹配做准备 int k=-1,j=0; next[0]=-1; while(j<length) { if( (k==-1)||(ch[j]==ch[k]) ) { ++j; ++k; next[j]=k; } else k=next[k]; } } int Index_KMP(My_string S,int next[],int pos=1) //KMP模式匹配 { //在主串中匹配S //其中要满足1<=pos<=length-S.getlength()+1 if(pos<0 || pos>length-S.Get_length()+1) { cout<<"pos参数不合理"<<endl; return -1; } int i=pos-1; int j=0; int n=length; int m=S.Get_length(); while(i<n && j<m) { if(j==-1 || ch[i]==S.ch[j]) //j=-1时,是在T的第一个元素就和S[i]不相等时 { i++; j++; } else j=next[j]; } if(j>=m) return i-m+1; //匹配成功 else return -1; } void Del_Str(int pos,int len) //删除 { //从pos位置开始删除长度为len的串 int i=pos-1; int j=pos+len-1; for(;j<length;i++,j++) ch[i]=ch[j]; ch[i]='\0'; length-=len; } bool Peplace_Str(My_string old_str,My_string new_str) //替换 { //用new_str替换主串中的old_str int pos=Index_BF(old_str); //先查出old_str在主串中的初始位置 if(-1==pos) { cout<<"主串中不存在子串 "<<old_str.ch<<endl; return false; } Del_Str(pos,old_str.Get_length()); Insert_Str(pos,new_str); return true; } };

主函数"main.cpp"

#include"mystring.h" int main() { cout<<"输入字符串T:"; char a[255]; cin>>a; cout<<endl; cout<<"输入字符串S:"; char b[255]; cin>>b; cout<<endl; My_string T,S; T.Assign(a); S.Assign(b); if(T.Str_cmp(S)>0) cout<<"字符串T>S"<<endl; else if(T.Str_cmp(S)<0) cout<<"字符串T<S"<<endl; else cout<<"字符串T=S"<<endl; My_string sub; T.Sub_Str(sub,3,4); cout<<"T.Sub(sub,3,4)为:"<<sub.C_str()<<endl; T.Concat_Str(sub,S); cout<<"字符串T和S连接后为:"<<sub.C_str()<<endl; cout<<"现在新串的长度为:"<<sub.Get_length()<<endl; cout<<"输入要插入T中的字符串:"; char c[20]; cin>>c; cout<<endl; cout<<"输入要插入的位置:"; int pos; cin>>pos; sub.Assign(c); T.Insert_Str(pos,sub); cout<<"现在串T的长度为:"<<T.Get_length()<<endl; cout<<"插入后字符串T为:"<<T.C_str()<<endl; cout<<"输入要进行模式匹配的子串:"; cin>>c; sub.Assign(c); int next[100]; memset(next,0,sizeof(next)); sub.Get_next(next); //pos=T.Index_BF(sub); pos=T.Index_KMP(sub,next); if(pos!=-1) { cout<<"在主串 "<<T.C_str()<<" 中子串 "<<sub.C_str() <<" 开始的位置为"<<pos<<endl; } cout<<"输入你要在主串中删除的子串的起始位置和长度:"; int len; cin>>pos>>len; T.Del_Str(pos,len); cout<<"删除后的主串为:"<<T.C_str()<<endl; cout<<"输入要在主串中替换掉的子串:"; cin>>a; My_string old_str; old_str.Assign(a); cout<<"输入新子串:"; cin>>b; My_string new_str; new_str.Assign(b); if(T.Peplace_Str(old_str,new_str)) cout<<"替换后的主串为:"<<T.C_str()<<endl; cout<<"清空字符串S"<<endl; S.Clear_Str(); int i=S.Get_length(); if(!i) cout<<"串S为空"<<endl; return 0; }

测试结果:

输入字符串T:wangjiakai 输入字符串S:liu 字符串T>S T.Sub(sub,3,4)为:ngji 字符串T和S连接后为:wangjiakailiu 现在新串的长度为:13 输入要插入T中的字符串:ailiudan 输入要插入的位置:11 插入的串的长度:8 插入前主串的长度:10 现在串T的长度为:18 插入后字符串T为:wangjiakaiailiudan 输入要进行模式匹配的子串:aiai 在主串 wangjiakaiailiudan 中子串 aiai 开始的位置为9 输入你要在主串中删除的子串的起始位置和长度:11 2 删除后的主串为:wangjiakailiudan 输入要在主串中替换掉的子串:kai 输入新子串:kaiLove 插入的串的长度:7 插入前主串的长度:13 替换后的主串为:wangjiakaiLoveliudan 清空字符串S 串S为空 Press any key to continue


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值