验证性实验5:串子系统班级学号012301114114姓名胡德文1.实验目的(1)掌握串的特点及顺序定长存储的方式。(2)掌握串的创建、连接、插入、删除、显示等操作。(3)掌握串的查找、取子字符串、比较串大小的操作(4)掌握模式匹配的基本思想及其算法。2.实验内容(1)由用户通过键盘输入建立一个字符串。(2)编写插入、删除、查找、比较、取子字符串、连接字符串、显示、模式匹配等程序。(3)设计一个选择式菜单,以菜单方式选择上述操作。串子系统*********************************************1------输入字串**2------连接字串**3------取出子串**4------删除子串**5------插入子串**6------查找子串**7------比较串大小**8------显示字串**0------返回*********************************************请输入菜单选项(0--8):3.实验程序#includestdio.h#defineSTRINGMAX100typedefstruct{charvec[STRINGMAX];intlen;}str;voidConcatStr(str*r1,str*r2){inti;printf(\n\t\tr1=%sr2=%s\n,r1-vec,r2-vec);if(r1-len+r2-lenSTRINGMAX)printf(\n\n\t两个串太长,溢出!\n);else{for(i=0;ir2-len;i++)r1-vec[r1-len+i]=r2-vec[i];r1-vec[r1-len+i]='0';r1-len=r1-len+r2-len;}}voidSubStr(str*r,inti,intj){intk;stra;str*r1=&a;if(i+j-1r-len){printf(\n\t\t子串超界!\n);return;}else{for(k=0;kj;k++)r1-vec[k]=r-vec[i+k-1];r1-len=j;r1-vec[r1-len]='\0';}printf(\n\t\t取出字符为:);puts(r1-vec);}voidDelStr(str*r,inti,intj){intk;if(i+j-1r-len)printf(\n\t\t所要删除的子串超界!\n);else{for(k=i+j;kr-len;k++,i++)r-vec[i]=r-vec[k];r-len=r-len-j;r-vec[r-len]='\0';}}str*InsStr(str*r,str*r1,inti){intk;if(i=r-len||r-len+r1-lenSTRINGMAX)printf(\n\t\t不能插入!\n);else{for(k=r-len-1;k=i;k--)r-vec[r1-len+k]=r-vec[k];for(k=0;kr1-len;k++)r-vec[i+k]=r1-vec[k];r-len=r-len+r1-len;r-vec[r-len]='\0';}returnr;}intIndexStr(str*r,str*r1){inti,j,k;for(i=0;r-vec[i];i++)for(j=i,k=0;r-vec[j]==r1-vec[k];j++,k++)if(!r1-vec[k+1])returni;return-1;}intLenStr(str*r){inti=0;while(r-vec[i]!='\0')i++;returni;}str*CreateStr(str*r){gets(r-vec);r-len=LenStr(r);returnr;}intEqualStr(str*r1,str*r2){for(inti=0;r1-vec[i]&&r2-vec[i]&&r1-vec[i]==r2-vec[i];i++);returnr1-vec[i]-r2-vec[i];}voidmain(){stra,b,c,d;str*r=&a,*r1;r-vec[0]='\0';charchoice,p;inti,j,ch=1;while(ch!=0){printf(\n);printf(\n\t\t串子系统);printf(\n\t\t*********************************************);printf(\n\t\t*1------输入字串*);printf(\n\t\t*2------连接字串*);printf(\n\t\t*3------取出子串*);printf(\n\t\t*4------删除子串*);printf(\n\t\t*5------插入子串*);printf(\n\t\t*6------查找子串*);printf(\n\t\t*7------比较串大小*);printf(\n\t\t*8------显示字串*);printf(\n\t\t*0------返回*);printf(\n\t\t*********************************************);printf(\n\t\t请选择菜单号(0--8):);scanf(%c,&choice);getchar();if(choice=='1'){printf(\n\t\t请输入一个字符串:);gets(r-vec);r-len=LenStr(r);}elseif(choice=='2'){printf(\n\t\t请输入所要连接的串:);r1=CreateStr(&b);ConcatStr(r,r1);printf(\n\t\t连接以后的新串值为:);puts(r-vec);}elseif(choice=='3'){printf(\n\t\t请输入从第几个字符开始:);scanf(%d,&i);getchar();printf(\n\t\t请输入取出的连续字符数:);scanf(%d,&j);getchar();SubStr(r,i,j);}elseif(choice=='4'){printf(\n\t\t请输入从第几个字符开始:);scanf(%d,&i);getchar();printf(\n\t\t请输入删除的连续字符数:);scanf(%d,&j);getchar();DelStr(r,i-1,j);}elseif(choice=='5'){printf(\n\t\t请输入在第几个字符前插入:);scanf(%d,&i);getchar();printf(\n\t\t请输入所要插入的字符串:);r1=CreateStr(&b);InsStr(r,r1,i-1);}elseif(choice=='6'){printf(\n\t\t请输入所要查找的字符串:);r1=CreateStr(&b);i=IndexStr(r,r1);if(i!=-1)printf(\n\t\t第一次出现的位置是第%d个.\n,i+1);elseprintf(\n\t\t该字串不在其中!\n);}elseif(choice=='7'){printf(\n\t\t请输入第一个串:);gets(c.vec);printf(\n\t\t请输入第二个串:);gets(d.vec);intk=EqualStr(&c,&d);if(k0)printf(\n\t\t第一个串大!\n);elseif(k0)printf(\n\t\t第二个串大!\n);elseprintf(\n\t\t两个串一样大!\n);}elseif(choice=='8'){printf(\n\t\t该串值为:);if(r-vec[0]=='\0')printf(空!\n);elseputs(r-vec);}elseif(choice=='0')break;elseprintf(\n\t\t请注意:输入有误!\n);if(choice!='X'&&choice!='X'){printf(\n\t\t按【Enter】键继续,按任意键返回主菜单.);p=getchar();if(p!='\xA'){getchar();break;}}}}4.程序运行5.实验小结本章要求我们掌握的是字符串的创建、连接、删除、显示、查找、取子串和比较字符串大小。串的本质就是一种特殊的线性表,而它的数据元素是由一个个字符组成的。串的存储方式分为紧凑型和非紧凑型两种,同时也了解了两种字符串的不同之处。在这一章的学习中了解了很多知识,增加了见解,拓宽了视野。在输入源代码的过程中巩固了串的运算,增强了记忆,在编译的过程中难免有错误,不过也正是这些错误将我不理解的地方都暴露出来了,让我可以知道自己的弱点,可以加强对知识的理解。这也是每次实验的目的。所以,总的来说,本次实验还是成功的。