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-1>r->len)
printf("\n\t\t所要删除的子串超界!
\n");
else
{for(k=i+j;klen;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->len>STRINGMAX)
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;klen;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);
else
printf("\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(k>0)
printf("\n\t\t第一个串大!
\n");
elseif(k<0)
printf("\n\t\t第二个串大!
\n");
else
printf("\n\t\t两个串一样大!
\n");
}
elseif(choice=='8')
{printf("\n\t\t该串值为:
");
if(r->vec[0]=='\0')
printf("空!
\n");
else
puts(r->vec);
}
elseif(choice=='0')
break;
else
printf("\n\t\t请注意:
输入有误!
\n");
if(choice!
='X'&&choice!
='X')
{printf("\n\t\t按【Enter】键继续,按任意键返回主菜单.");
p=getchar();
if(p!
='\xA')
{getchar();break;}
}
}
}
4.程序运行
5.实验小结
本章要求我们掌握的是字符串的创建、连接、删除、显示、查找、取子串和比较字符串大小。
串的本质就是一种特殊的线性表,而它的数据元素是由一个个字符组成的。
串的存储方式分为紧凑型和非紧凑型两种,同时也了解了两种字符串的不同之处。
在这一章的学习中了解了很多知识,增加了见解,拓宽了视野。
在输入源代码的过程中巩固了串的运算,增强了记忆,在编译的过程中难免有错误,不过也正是这些错误将我不理解的地方都暴露出来了,让我可以知道自己的弱点,可以加强对知识的理解。
这也是每次实验的目的。
所以,总的来说,本次实验还是成功的。