串的基本操作.docx
《串的基本操作.docx》由会员分享,可在线阅读,更多相关《串的基本操作.docx(13页珍藏版)》请在冰豆网上搜索。
串的基本操作
串的基本操作
#include
#include
#include
typedefstruct
{
char*str;
intlength;
}HString;//堆串
//初始化
voidInitString(HString&S)
{
S.str='\0';
S.length=0;
}
//堆串赋值
voidStrAssign(HString&S,char*chars)
{
inti,len;
char*p;
p=chars;
return1;
}
//串的比较操作
intStrCompare(HStringS,HStringT)
/*比较串S与串T的大小,如果S的值大于T,返回正值;如果S的值小于T,返回负值;如果相等,返回0*/
{
inti;
for(i=0;iif(S.str[i]!
=T.str[i])
return(S.str[i]-T.str[i]);
return(S.length-T.length);
}
//串的插入操作
intStrInsert(HString&S,intpos,HStringT)
/*在S中第pos个位置插入T*/
{
inti;
if(pos<0||pos-1>S.length)
{
printf("插入位置错误\n");
return0;
}
S.str=(char*)realloc(S.str,(S.length+T.length)*sizeof(char));
if(!
S.str)
{
printf("内存分配失败\n");
return0;
}
for(i=S.length-1;i>pos-1;i--)
S.str[i+T.length]=S.str[i];
for(i=0;iS.str[pos+i-1]=T.str[i];
S.length=S.length+T.length;
return1;
}
//串的删除操作
intStrDelete(HString&S,intpos,intlen)
/*在S中删除pos开始的len个字符*/
{
inti;
char*p;
if(pos<0||pos+len-1>S.length)
{
printf("删除位置错误,参数len不合法\n");
return0;
}
p=(char*)malloc(S.length-len);
if(!
p)
{
printf("内存分配失败\n");
return0;
}
for(i=0;ip[i]=S.str[i];
for(i=pos-1;ip[i]=S.str[i+len];
S.length=S.length-len;
free(S.str);
S.str=p;
return1;
}
//串的连接操作
intStrConcat(HString&T,HStringS)
/*将串S连接在T后*/
{
inti;
T.str=(char*)realloc(T.str,(T.length+S.length)*sizeof(char));
if(!
T.str)
{
printf("内存分配失败\n");
return0;
}
else
{
for(i=T.length;iT.str[i]=S.str[i-T.length];
T.length=T.length+S.length;
}
return1;
}
//截取子串操作
intSubString(HString&Sub,HStringS,intpos,intlen)
/*将从S中第pos个位置截取长度为len的子串赋值给Sub*/
{
inti;
if(Sub.str)free(Sub.str);
if(pos<0||len<0||pos+len-1>S.length)
{
printf("参数len和pos不合法\n");
return0;
}
else
{
Sub.str=(char*)malloc(len*sizeof(char));
if(!
Sub.str)
{
printf("内存分配失败\n");
return0;
}
for(i=0;iSub.str[i]=S.str[pos+1-1];
Sub.length=len;
return1;
}
}
//串的定位操作
intStrIndex(HStringS,intpos,HStringT)
/*在主串S中的第pos个位置开始查找子串T,如果找到,返回子串在主串中的位置;否则,返回-1*/
{
inti,j;
if(StrEmpty(T))
{
printf("子串为空\n");
return0;
}
i=pos-1;
j=0;
while(i{
if(S.str[i]==T.str[j])
{
i++;
j++;
}
else
{
i=i-j+1;
j=0;
}
}
if(j>=T.length)
returni-j+1;
else
return-1;
}
//串的替换操作
intStrReplace(HString&S,HStringT,HStringV)
/*将串S中的所有子串T用V替换*/
{
inti=1;
intflag;
if(StrEmpty(T))
{
printf("子串为空\n");
return0;
}
do
{
i=StrIndex(S,i,T);
if(i)
{
StrDelete(S,i,StrLength(T));
flag=StrInsert(S,i,V);
if(!
flag)
{
printf("插入失败\n");
return0;
}
i+=StrLength(V);
}
}while(i);
return1;
}
//串的清空操作
voidStrClear(HString&S)
{
if(S.str)free(S.str);
S.str='\0';
S.length=0;
}
//输出串
voidStrprint(HStringS)
{
inti;
for(i=0;iprintf("%c",S.str[i]);
}
intscan()
{
intd;
printf("\n\n请输入要进行的操作\n1.初始化一个串S\n2.清空串\n3.求串长度\n4.检查串是否为空\n5.输出串\n6.串的赋值操作\n7.串的复制操作\n8.串的比较操作\n9.串的插入操作\n10.串的删除操作\n11.串的连接操作\n12.截取子串操作\n13.串的替换操作\n14.串的定位操作\n其他键退出...\n");
scanf("%d",&d);
return(d);
}
main()
{
intquit=0,pos,len;
chara[200];
char*s=a;
HStringS,T,V,Sub;
while(!
quit)
switch(scan())
{
case1:
InitString(S);break;
case2:
StrClear(S);break;
case3:
printf("串的长度为:
%d\n",StrLength(S));break;
case4:
if(StrEmpty(S))printf("串为空\n");elseprintf("串非空\n");break;
case5:
Strprint(S);break;
case6:
printf("请输入要给串S赋的值:
");
scanf("%s",s);
StrAssign(S,s);
break;
case7:
printf("将串T复制给串S\n");
printf("请输入串T的值:
");
scanf("%s",s);
InitString(T);
StrAssign(T,s);
if(StrCopy(S,T))printf("复制成功。
");
break;
case8:
printf("比较串S与串T的大小,如果S的值大于T,返回正值;如果S的值小于T,返回负值;如果相等,返回0\n");
printf("请输入串T的值:
");
scanf("%s",s);
InitString(T);
StrAssign(T,s);
if(StrCompare(S,T)>0)printf("串S大于串T\n");
elseif(StrCompare(S,T)<0)printf("串S小于串T\n");
elseprintf("串S与串T相等\n");
break;
case9:
printf("在S中第pos个位置插入T\n");
printf("请输入pos:
");
scanf("%d",&pos);
printf("请输入T:
");
scanf("%s",s);
InitString(T);
StrAssign(T,s);
if(StrInsert(S,pos,T))printf("插入成功\n");
break;
case10:
printf("