实验三 串基本操作的实现Word下载.docx
《实验三 串基本操作的实现Word下载.docx》由会员分享,可在线阅读,更多相关《实验三 串基本操作的实现Word下载.docx(14页珍藏版)》请在冰豆网上搜索。
T,则返回值=0;
若S=T,则返回值<
0;
若S<
T,则返回值<
0。
StrLength(S)
返回串S序列中的字符个数,即串的长度。
ClearString(&
将S清为空串。
Concat(&
T,S1,S2)
初始条件:
串S1和S2存在。
操作结果:
用T返回由S1和S2联接而成的新串。
SubString(&
Sub,S,pos,len)
串S存在,1≤pos≤StrLength(S)且0≤len≤StrLength(S)-pos+1。
用Sub返回串S的第pos个字符起长度为len的子串。
Index(S,T,pos)
串S和T存在,T是非空串,1≤pos≤StrLength(S)。
若主串S中存在和串T值相同的子串,则返回它在主串S中第pos个字
符之后第一次出现的位置;
否则函数值为0。
Replace(&
S,T,V)
串S,T和V存在,T是非空串。
用V替换主串S中出现的所有与T相等的不重叠的子串。
StrInsert(&
S,pos,T)
串S和T存在,1≤pos≤StrLength(S)+1。
在串S的第pos个字符之前插入串T。
StrDelete(&
S,pos,len)
串S存在,1≤pos≤StrLength(S)-len+1。
从串S中删除第pos个字符起长度为len的子串。
实验源代码:
#include<
iostream>
stdio.h>
stdlib.h>
string.h>
usingnamespacestd;
#defineERROR0
#defineINFEASIBLE-1
#defineOVERFLOW-2
#defineTRUE1
#defineFALSE0
#defineOK1
#defineMAXSTRLEN255//用户可在内定义最大串长
typedefunsignedcharSString[MAXSTRLEN+1];
//0号单元存放串长度
typedefintStatus;
//Status是函数的类型,其值是函数结果的代码
typedefintElemType;
//chars是串常量,赋于串T的值为chars;
voidStrAssign(SString&
T,charchars[255])
{
intlength,i=0;
length=strlen(chars);
if(length>
255)
{
cout<
<
"
字符串长度超出范围,将截取前个字符;
endl;
for(i=0;
i<
MAXSTRLEN;
i++)
T[i+1]=chars[i];
T[0]=255;
}
else
length;
T[0]=length;
}
//串S存在,由串S复制得串T;
voidStrCopy(SString&
T,SStringS)
inti=0;
while(i<
=S[0])
T[i]=S[i];
i++;
//销毁串
voidDestroyString(SString&
S[0]=0;
cout<
串已被销毁;
//串S存在,若S为空串,则返回TRUE,否则返回FALSE。
StatusStrEmpty(SStringS)
if(S[0]==0)
该串为空串;
returnTRUE;
该串不为空串;
returnFALSE;
//串S和T存在,若S>
T,则返回值>
//若S=T,则返回值=0;
StatusStrCompare(SStringS,SStringT)
inti,k=0;
if(S[0]>
T[0])
return1;
elseif(S[0]<
return(-1);
for(i=1;
=S[0];
{
if(S[i]==T[i])
k=1;
else
break;
}
if(k==1)
return0;
else
return2;
//串S存在,返回串S序列中的字符个数,即串的长度。
StatusStrLength(SStringS)
returnS[0];
//串S存在,将S清为空串。
voidClearString(SString&
inti;
for(i=1;
S[i]='
\0'
;
串已被重置为空串;
//串S1和S2存在,用T返回由S1和S2联接而成的新串。
voidConcat(SString&
T,SStringS1,SStringS2)
inti=1,j=0;
if(S1[0]+S2[0]>
MAXSTRLEN)
两串联接后超出长度范围,将进行截断;
=S1[0];
T[i]=S1[i];
if(i<
while(i<
{
i++;
j++;
T[i]=S2[j];
}
T[0]=MAXSTRLEN;
for(j=1;
j<
=S2[0];
j++)
T[i]=S2[j];
i++;
T[0]=S1[0]+S2[0];
//串S存在,≤pos≤StrLength(S)且≤len≤StrLength(S)-pos+1
//用Sub返回串S的第pos个字符起长度为len的子串
voidSubString(SString&
Sub,SStringS,intpos,intlen)
inti,j=1;
if(pos>
=1&
&
pos<
=StrLength(S))
if(len>
=0&
len<
=StrLength(S)-pos+1)
Sub[0]=len;
for(i=pos;
=pos+len-1;
Sub[j]=S[i];
j++;
cout<
输入len的值不合法;
else
输入pos的值不合法;
//串S和T存在,T是非空串,≤pos≤StrLength(S)
//若主串S中存在和串T值相同的子串,则返回它在
//主串S中第pos个字符之后第一次出现的位置;
否则函数值为。
StatusIndex(SStringS,SStringT,intpos)
intn,m,i;
SStringSub;
0)
n=StrLength(S);
m=StrLength(T);
i=pos;
while(i<
=n-m+1)
SubString(Sub,S,i,m);
if(StrCompare(Sub,T)!
=0)
returni;
return0;
//串S,T和V存在,T是非空串
//用V替换主串S中出现的所有与T相等的不重叠的子串
voidReplace(SString&
S,SStringT,SStringV)
intn,i,j=1;
while((n=Index(S,T,1))!
j=1;
for(i=n;
=n+StrLength(T)-1;
S[i]=V[j];
j++;
//串S和T存在,≤pos≤StrLength(S)+
//在串S的第pos个字符之前插入串T
voidStrInsert(SString&
S,intpos,SStringT)
intn,m,i,j,u;
n=StrLength(T);
u=StrLength(S);
if((S[0]+T[0])>
插入后会超出串长度范围,将进行截取;
m=MAXSTRLEN-(n+pos-1);
j=pos;
for(i=MAXSTRLEN;
i>
MAXSTRLEN-m;
i--)
S[i]=S[j];
for(i=pos;
=n;
S[i]=T[j];
S[0]=MAXSTRLEN;
j=u;
for(i=u+n;
=n+pos;
j--;
n+pos;
S[0]=u+n;
voidStrDelete(SString&
S,intpos,intlen){
//串S存在,≤pos≤StrLength(S)-len+1
//从串S中删除第pos个字符起长度为len的子串
intn,i,j;
n=StrLength(S);
if(pos<
1||pos>
StrLength(S)-len+1)
输入的pos值不合法;
j=pos+len;
S[0]=n-len;
S[n-len+1]='
voidshuru(SString&
T){
charchars[256];
请输入你要的字符数据:
gets(chars);
StrAssign(T,chars);
voidshuchu(SStringT)
for(inti=0;
T[0];
T[i+1];
intmain()
intn,pos,len;
SStringT2,T1,S,S1,S2,Sub,V;
shuru(S1);
串S1为:
shuchu(S1);
shuru(T1);
请输入pos的大小:
cin>
>
pos;
n=Index(S1,T1,pos);
if(n==0)
主串中不存在这样的子串;
第一个这样的子串在主串中第"
个字符后出现的位置为:
n<
getchar();
shuru(T2);
shuru(V);
Replace(S1,T2,V);
取代后的串S为:
shuru(S2);
Concat(S,S1,S2);
联接后的新串S为:
shuchu(S);
串S的长度为:
StrLength(S)<
DestroyString(S1);
DestroyString(S2);
【测试数据及实验结果】
测试数据及实验结果如下:
【实验小结】
定长顺序串的存储结构与c语言中用字符指针存储字符串相比有何优点?
答:
优点是定长顺序串的存储结构类似于数组,调用起来比较方便快捷.
【源代码说明】
1.文件名:
shiyan3.cpp