将主串中所有出现的子串用另一个字符串替换

lanowen 2008-03-18 05:53:39
//程序有点问题,请求修改......
#include <iostream.h>
const maximum=100;
class seqstring
{


public:
char string[maximum],substring[maximum],s1[4];
int length,sublength,length1;

seqstring()
{
length=0;sublength=0;length1=0;
}
~seqstring(){}
void create();//创建主串string
void substr(int i,int j); //返回串string的第i个位置开始的j个字符组成的串
int index(); //返回子串substring在主串string中的位置。若不在,返回-1
int insert(int i);//求子串插入到主串的第i个位置
int delstr(int i,int j);//删除主串中从第i个位置开始的j个字符
void repstrall();//将主串中所有出现的子串均用s1替换
void display();//显示替换后的主串
};

void seqstring::create()
{ int i=0;
cout<<"请输入你要计算的字符串,以‘*’为结束标志:"<<endl;
cin>>string[i];
while(string[i]!='*')
{
i++;
cin>>string[i];
}
string[i]='\0';
length=i;
}

void seqstring::substr(int i,int j)
{

int k;
if(i<1 || i>length || j<1 || i+j>length+1)
{
sublength=0;
}
else
{
for(k=i-1;k<i+j-1;k++)
substring[k-i+1]=string[k];
substring[k-i+1]='\0';
sublength=k-i+1;
}



}

int seqstring::index()
{
int i=0,j=0,k;
while(i<length && j<sublength)
{
if(string[i]==substring[j])
{
i++;j++;
}
else
{
i=i-j+1;
j=0;
}
}
if(j>=sublength)
k=i-sublength+1;
else
k=-1;
return (k);
}

int seqstring:: insert(int i)
{
int j;
if(i>length+1)
return (0);
else
{
for(j=length+length1;j>=i-1+length1;j--)
string[j]=string[j-length1];
for(j=i-1;i<i-1+length1;j++)
string[j]=s1[j-i+1];
length=length+length1;
return(1);
}
}

int seqstring::delstr(int i,int j)
{
int k;
if(i<1 || i>length || j<1 || i+j>length+1)
return (0);
else
{
for(k=i+j-1;k<=length;k++)
string[k-j]=string[k];
length=length-j;
}
return (1);
}

void seqstring::repstrall()
{
int i;
i=index();
while(i>=0)
{
delstr(i,sublength);
insert(i);
i=index();
}
}

void seqstring::display()
{
int i;
for(i=0;i<length;i++)
cout<<string[i];
cout<<endl;
}

void main()
{
seqstring mystring;
//seqstring mysubstring;
for(int k=0;k<3;k++)
mystring.s1[k]='?';
mystring.s1[k]='\0';
mystring.length1=3;
mystring.create();
cout<<"你刚才输入的主串是:"<<endl;
for( k=0;k<mystring.length;k++)
cout<<mystring.string[k];
cout<<endl;
cout<<"请输入你需要的子串是从主串中的第几个字符开始?"<<endl;
int i;
cin>>i;
cout<<"请输入你需要的子串的长度是多少?"<<endl;
int j;
cin>>j;

mystring.substr(i,j);
cout<<"你所需要的子串是:"<<endl;
for( k=0;k<mystring.sublength;k++)
cout<<mystring.substring[k];
cout<<endl;
//seqstring s1;

mystring.repstrall( );
cout<<"替换后的新字符串是:"<<endl;
mystring.display();
}










...全文
394 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
lanowen 2008-03-19
  • 打赏
  • 举报
回复
memset 是系统函数还是自定义函数,为什么要把字符数组全部冲0呢???
ryfdizuo 2008-03-18
  • 打赏
  • 举报
回复
//问题:
int seqstring:: insert(int i)
{
int j;
if(i> length+1)
return (0);
else
{
for(j=length+length1;j>=i-1+length1;j--)
string[j]=string[j-length1];
//这里的循环的条件判断,怎么和j没关,是不是笔误...
for(j=i-1;i <i-1+length1;j++)
string[j]=s1[j-i+1];
length=length+length1;
return(1);
}
}
//建议:类的构造函数将字符数组全部冲0;
seqstring()
{
length=0;sublength=0;length1=0;
memset(string, 0, maximum);
memset(substring, 0, maximum);
memset(s1, 0, 4);
}
课程介绍:第一章:正则表达式(regularexpression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串取出符合某个条件的子串等。第二章:http协议是一种无状态协议,不记录用户行为,我们可以利用cookie记录数据,方便用户操作,提升用户体验。第三章:ECMAScript6.0(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了。它的目标,是使得JavaScript语言可以用来编写复杂的大型应用程序,成为企业级开发语言。第四章:本章主要讲解JS动画原理、动画函数封装和轮播。第五章:本章主要讲解面向对象、构造函数和继承、原型链和继承。第六章:本节课程主要讲解了什么是Ajax、如何使用Ajax发送get请求、如何使用Ajax发送post请求、JSON数据格式、回调地狱、Promise和Ajax的同源策略、跨域请求。第七章:本章主要讲解html、val、attr、prop、class、全选框、动画、节点遍历、ajax、sonp、event、multiple、plugin、plugin、magnifier。第八章:本章主要讲解UML类图、单例模式、工厂模式、策略模式、代理模式、观察者模式。第九章:本章主要讲解为什么要模块化、原生JS,模块的写法、AMD、CommonJS&Webpack。第十章:本节课程主要讲解了服务器安装环境配置、端口及ip基本常识、简单认识PHP(helloworld)、基本语法和动态网页原理。第十一章:本节课程主要讲解了什么是SASS、SASS的预处理、ass语法(变量、嵌套、导入、mixin、扩展、function、expression)。第十二章:本节课程主要讲解了什么是GULP、GULP环境配置、GULP基本使用及GULP的插件安装与使用。
基于定长顺序存储结构实现对串的赋值、串比较、求子串的位置、串替换等操作。要求所有操作均以函数的形式实现,在主函数调用各个函数实现整体功能。 注意:每一个字符串的第一个元素存放的是该字符串的长度(不包括第一个元素),除串的赋值外,其他所有操作(比较、求子串的位置、串替换)等都不应包含该字符。 1.1.实验1:串赋值函数实现: 按照系统已经定义的函数接口编写函数实体,实现:将输入数组StrInput[]的数据赋值给待赋值数组StrTobeAssigned[],其待赋值数组StrTobeAssigned[0]存放有效数据的长度,StrTobeAssigned[1]之后存放带赋值数据。 具体要求和相关假设为: ① 函数接口定义为:int MyStrAssign(char * StrTobeAssigned, char * StrInput); ② 输入参数:待赋值字符串变量StrTobeAssigned,字符串的期望值StrInput; ③ 输出参数:无; ④ 处理规则及返回值:将StrTobeAssigned[1]及之后的内容赋值为StrInput的有效内容,StrTobeAssigned[0]赋值为StrInput有效字符的长度,并返回1; ⑤ 假设: a)两个字符串均不为空串; b)StrInput存放的是一个完成的字符串(不包含长度); c)赞不考虑输入数据超过数组总长度的情况。 1.2实验2:串替换函数: 按照系统已经定义的函数接口编写函数实体,实现:在主串MainStr查找是否存在某特定子串SubStr1,若存在则将所有的SubStr1替换为新的指定子串SubStr2,函数返回字符串替换的次数。 具体要求和相关假设为: ① 函数接口定义为:int MyStrReplace(char * MainStr, char * SubStr1, char * SubStr2); ② 输入参数:主串变量MainStr,子串变量SubStr1,SubStr2; ③ 输出参数:无; ④ 处理规则及返回值:若主串存在子串,用SubStr2替换主串MainStr出现的所有与SubStr1相同的不重叠的子串,并返回字符串替换的次数;否则返回0。 ⑤ 假设: a)主串和两个子串均不为空串; b)MainStr[0]和SubStr1[0],SubStr2[0]分别存放对应字符串的长度,不用替换该部分。 2.问题分析 (1)根据实验一的内容可知,我们需要通过编写函数实体的形式实现串的赋值操作,主要的思路包括: (a)获得输入字符串的长度len; (b)将输入字符串的长度len赋值给待赋值字符串的第一个元素StrTobeAssigned[0]; (c)依次将输入字符串的数据赋值给待赋值字符串。 (2)根据实验二的内容可知,我们需要通过编写函数实体的形式实现串的替换操作,主要的思路包括: (a)遍历主串MainStr,检查是否存在某特定子串SubStr1; (b)如果存在则找到子串主串的位置; (c)在主串删除该子串并更新主串长度; (d)在主串插入该子串并更新主串长度; (e)过程记录替换字符串的次数,遍历结束后返回该次数(如果没有替换则为0); 如果有必要,可以使用本实验已经提供的相关函数,如:求子串位置的函数MySubStrIndex(),子串删除函数MyStrDelete()和子串插入函数MyStrInsert()等

64,643

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧