串的基本操作

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档