用串的顺序存储结构实现串替换操作Replace(&S,T,V)

来源:互联网 发布:传奇游戏源码是什么 编辑:程序博客网 时间:2024/05/22 08:11

原题:用串的顺序存储结构实现串替换操作Replace(&S,T,V)。
分析:替换操作,操作结果为以串V替换所有在串S中出现的和非空串T相等的不重叠子串。用文件originalstr.txt存储原来的字符串,laterstr.txt文件存储修改后的字串。

#include<iostream>#include<fstream>#include<strstream>#include<stdlib.h>#include<time.h>#include <conio.h>using namespace std;int Createmainstr();//函数原型声明int Replace(char *mainstr,char *t,char *v);//函数原型声明int Displaystr(char *str);//函数原型声明int GetInfo(char *t,char *v);//函数原型声明int main(){Createmainstr();//生成主串char mainstr[150],v[20],t[20];int i=1;char ch;ifstream infile("originalstr.txt",ios::in);while(infile.get(ch)){//将存储在original.txt文件中的主串读入字符数组mainstr中mainstr[i++]=ch;}mainstr[0]=i-1;//主串的实际长度为当前的i-1值mainstr[i]='\0';//加上串结束符cout<<"主串mainstr为:";Displaystr(mainstr);//输出主串GetInfo(t,v);//获取相关信息Replace(mainstr,t,v);//调用字符串替换函数cout<<"替换字符串后的主串mainstr为:";Displaystr(mainstr);//输出主串return 1;}int GetInfo(char *t,char *v){//获取相关信息int i=1;char ch;cout<<"你要替换主串中的哪类子字符串,请输入:";i=1;cin.get(ch);//The fflush function flushes a stream,即清空输入流while(ch!='&')//&为输入时的结束标志{t[i++]=ch;cin.get(ch);}t[0]=i-1;//0号单元存储串长,当前串的实际长度为当前的i-1值t[i]='\0';cout<<"你输入的字符串长度为:"<<(int)t[0]<<endl;cout<<endl;cout<<"你要用哪一个字符串来替换这些子串,请输入:";fflush( stdin );i=1;cin.get(ch);while(ch!='&')//&为输入时的结束标志{v[i++]=ch;cin.get(ch);}v[0]=i-1;//0号单元存储串长,当前串的实际长度为当前的i-1值v[i]='\0';cout<<"你输入的字符串长度为:"<<(int)v[0]<<endl;cout<<endl;return 1;}int Displaystr(char *str){for(int k=1;k<=str[0];k++){//输出字符串,第0号位置存放的是该串的长度,故要跳过它,从第一号位开始输出cout<<str[k];}cout<<endl;return 1;}int Createmainstr(){//向originalstr.txt文件中写入随机生成的主串//定义文件流对象,打开磁盘文件originalstr.txtofstream outfile("originalstr.txt",ios::out);if(!outfile){cerr<<"文件打开失败!"<<endl;exit(1);}srand((unsigned)time(NULL));char ch;for(int i=1;i<=20;i++){ch=rand()%2+'a';outfile<<ch;}outfile.close();return 1;}int Replace(char *mainstr,char *t,char *v){//字符串替换函数,操作结果为以串v替换所有在串s中出现的和非空的 //串t相等的不重叠子串(注意只替换不重叠的子串)int start=1,i,j;while(start<=mainstr[0]-t[0]+1){i=1;while(start+i-1<=mainstr[0] && i<=t[0] && mainstr[start+i-1]==t[i])i++;//在mainstr中查找起始位置为start的子串tif(i>t[0]){//查找成功if(t[0]<v[0]){//将mainstr中从start+t[0]个字符到第mainstr[0]个字符依次 //后移v[0]-t[0]个字符for(j=mainstr[0];j>=start+t[0];j--)mainstr[j+v[0]-t[0]]=mainstr[j];}else if(t[0]>v[0]){//将mainstr中从start+t[0]个字符到第mainstr[0]个字符依次 //前移t[0]-v[0]个字符for(j=start+t[0];j<=mainstr[0];j++)mainstr[j-(t[0]-v[0])]=mainstr[j];}//将v复制到mainstr[start:start+v[0]-1]中for(j=1;j<=v[0];j++)mainstr[j+start-1]=v[j];mainstr[0]=mainstr[0]+v[0]-t[0];//mainstr的新长度为mainstr[0]+v[0]-t[0]}elsestart=start+i;//查找失败,新的起始位置为start+i}return 1;}


 

原创粉丝点击