串的基本操作
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一.实验目的
如果计算机语言没有把串作为一个预先定义好的基本类型对待,又需要用该语言写一个涉及串操作的软件系统时,用户必须自己实现串类型。试着实现串类型,并写一个串的基本操作演示系统。
二.实验内容
实现若干串的常用基本操作,如串赋值、求串长、串替换、串比较、求子串及串的模式匹配等。模块设计
本程序包含两个模块:主程序模块、串操作模块。其调用关系如图2所示。
图2 模块调用关系示意图
三.实验步骤(可选)
数据类型定义
(1) 字符串的定义
typedef struct
{
char *ch; //串存放的数组
int curLen; //串的长度
}HString;
(2) 全局变量声明
#define OK 1 //操作成功
#define OVERFLOW 0 //溢出
#define ERROR 0 //出错
系统主要子程序详细设计
(1)主程序模块设计
主函数。设定用户操作界面,调用操作模块函数。
void main()
{
输出操作菜单;
Switch (1)
{
输出操作序号c;
switch (c)
{
调用相应函数执行相应操作;
输出操作结果;
}
}
}
(2)求子串
int substring(HString &Sub,HString S,int pos,int len)
{ //´串sub返回串S的第pos个字符起长度为len的子串int i;
if(pos<0||pos>S.curLen||len<0||len>S.curLen-pos)
{ //若位置或长度不合法,退出
printf("输入不合法\n");
exit(OVERFLOW); //退出
}
else
{
if(Sub.ch) free(Sub.ch); //释放子串sub原有空间
if(!len) //若长度len为0
{ //就爱那个子串置为空串Sub.ch=NULL;
Sub.curLen=0;
}
else //若长度len不为0
{
Sub.ch=(char*)malloc(len*sizeof(char));
for(i=0; i { //从串S的第pos个字符开始依次复制其后长度为len的字符串sub中Sub.ch[i]=S.ch[pos-1+i]; Sub.curLen=len; //修改串sub的串长 } } return OK; } } (3)子串定位(串的模式匹配) int Index(HString &ob1,HString &ob2,int pos) { //判断从第pos个字符起,ob2是否为ob1的子串 //若是返回ob2在ob1中的起始位置,否则返回-1 if(pos<0||pos>ob1.curLen) {//若输入的数值pos不在ob1的串长范围内 printf("输入有误\n"); exit(ERROR); } for(int i=pos-1; i<=StrLength(ob1)-StrLength(ob2); i++) { //从ob1的第pos个字符起查找子串ob2 int j=0; //从ob2的第一个字符起开始查找 while(j if(ob1.ch[i+j]==ob2.ch[j]) //若找到匹配字符 j++; //则依次向后查找 else break; //一旦失配,则跳出查找,此时j还未能达到子串串长} if(j==StrLength(ob2)) //若j达到子串串长,即ob2的所有字符都能和ob1匹配return i; //返回ob2在ob1的起始位置i } return -1; //ob2不是ob1的子串,返回-1 } (4)串替换 void Replace(HString &ob1,HString &ob2,HString &ob3) { //将原串ob1的所有子串ob2都替换为插入串ob3 printf("原串:"); for(int i=0; i printf("%c",ob1.ch[i]); printf("\n 子串:"); for(int j=0; j printf("%c",ob2.ch[j]); printf("\n"); printf("插入串:"); for(int k=0; k printf("%c",ob3.ch[k]); printf("\n"); int len=StrLength(ob2); //ob2的长度 while(Index(ob1,ob2,0)!=-1) //当ob2是ob1的子串,替换所有的ob2 { int len2=StrLength(ob3)+StrLength(ob1)-StrLength(ob2); //新串的长度 int i=Index(ob1,ob2,0); //调用子串定位函数 char *p=new char[StrLength(ob1)-i-len+1]; //临时数组 char *q=new char[len2]; //存储新串的数组 for(int j=i+len; j p[j]=ob1.ch[j]; //将不用替换的后部分存入数组p