串的基本运算
- 格式:doc
- 大小:212.00 KB
- 文档页数:9
串的基本运算
#include
#define STRINGMAX 100
typedef struct
{
char vec[STRINGMAX];
int len;
}str;
void ConcatStr(str *r1,str *r2)
{
int i;
if(r1->len+r2->len>STRINGMAX)//连接后的串长超过串的最大长度
printf("两串太长,溢出\n");
else
{
for (i=0;ilen;i++)
r1->vec[r1->len+i]=r2->vec[i];
r1->vec[r1->len+i]='\0';
r1->len=r1->len+r2->len;
}
}
void SubStr(str *r,int i,int j)
{
int k;
str a;
str *r1=&a;
if(i+j-1>r->len)
{
printf("\n字串超界\n");
return ;
}
else
{
for(k=0;k
r1->vec[k]=r->vec[i+k-1];
r1->vec[j]='\0';
}
printf("\n取出字符为:");
puts(r1->vec);
}
void DelStr(str *r,int i,int j)
//删除字串 i指定位置 j为连续删除的字符个数
{ int k;
if(i+j-1>r->len)
printf("\n\t\t所要删除的字串超界");
else
{
for(k=i+j;klen;k++,i++)
r->vec[i]=r->vec[k];
r->len=r->len-j;
r->vec[r->len]='\0';
}
printf("删除字符后的串为:");
puts(r->vec);printf("\n");
}
str *InsStr(str *r,str *r1,int i)
{
int k;
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';
}
return r;
}
int IndexStr(str *r,str *r1)
{
int i,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])
return i;
return -1;
}
int LenStr(str *r)
{
int i=0;
while(r->vec[i]!='\0')
i++; return i;
}
str *CreateStr(str *r)
{
gets(r->vec);
r->len=LenStr(r);
return r;
}
int EqualStr(str *r1,str *r2)
{int i;
for( i=0;r1->vec[i]&&r2->vec[i]&&r1->vec[i]==r2->vec[i];i++);
//每个字符逐一比较
return r1->vec[i]-r2->vec[i];
}
void main()
{
str a,b,c,d;
str*r=&a,*r1;
char choice,p;
int i,j,ch=1;
r->vec[0]='\0';
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****************\n");
printf("请选择(0-8):");
scanf("%c",&choice);
getchar();//getchar()不可删
if(choice=='1')
{
printf("\n\t\t请输入字符串:");
gets(r->vec); r->len=LenStr(r);
}
else if(choice=='2')
{
printf("\n\t\t请输入所要连接的串:");
r1=CreateStr(&b);
ConcatStr(r,r1);
printf("\n\t\t连接以后的新串值为:");
puts(r->vec);
}
else if(choice=='3')
{
printf("\n\t\t请输入从第几个字符开始:");
scanf("%d",&i);
printf("\n\t\t请输入要取字符的个数:");
scanf("%d",&j);
//getchar();此处可删
SubStr(r,i,j);
}
else if(choice=='4')
{
printf("\n请输入从第几个字符开始:");
scanf("%d",&i);
//getchar();都可要可不要
printf("\n请输入删除的连续字符数:");
scanf("%d",&j);
//getchar();
DelStr(r,i-1,j);
}
else if(choice=='5')
{
printf("\n\t\t请输入从第几个字符开始:");
scanf("%d",&i);
getchar();//此处可要可不要
printf("\n\t\t请输入所要插入的字符串:");
getchar();//非要不可
//gets(r1->vec);r1->len=LenStr(r1);
r1=CreateStr(&b);
InsStr(r,r1,i-1);
printf("\n\t\t插入字符串后的字符串显示为:");
puts(r->vec);
}
else if(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");
}
else if(choice=='7')
{int k;
printf("\n\t\t请输入第一个串:");
gets(c.vec);printf("\n");
printf("\n\t\t请输入第二个串:");
gets(d.vec);printf("\n");
k=EqualStr(&c,&d);
if(k>0)
printf("\n\t\t第一个串大\n");
else if(k<0)
printf("\n\t\t第二个串大\n");
else
printf("\n\t\t两个串一样大\n");
}
else if(choice=='8')
{
printf("\n\t\t该串值为:\n");
if(r->vec[0]=='0')
printf("空\n");
else
puts(r->vec);
}
else if(choice=='0')
break;
else
printf("\n\t\t请注意输入有误\n");}}