KK->StrHead[n].ch[i]=M.ch[i];
KK->StrHead[n].length=M.length;
for(i=0;i<=KK->StrHead[n].length-t.length;i++)//新串与串t比较
{for(j=i,m=0;mStrHead[n].ch[j]==t.ch[m];m++,j++);
if(m==t.length)//在新串中找到和串t相等的子串
{y=1;
if(t.length>v.length)//串t的长度大于串v,修改新串内容
{
for(k=i,m=0;mStrHead[n].ch[k]=v.ch[m];
for(k=i+v.length;kStrHead[n].length-t.length+v.length;k++)KK->StrHead[n].ch[k]=KK->StrHead[n].ch[k-v.length+t.length];
}
elseif(t.length==v.length)//串t的长度等于串v,修改新串内容
{for(j=i,m=0;mStrHead[n].ch[j]=v.ch[m];}
else//串t的长度小于串v,修改新串内容
{if((KK->StrHead[n].ch=(char*)realloc(KK->StrHead[n].ch,(KK->StrHead[n].length-t.length+v.length)*sizeof(char)))==NULL)exit(OVERFLOW);
for(k=KK->StrHead[n].length-t.length+v.length-1,m=KK->StrHead[n].length-1;k>=v.length+i;k--,m--)KK->StrHead[n].ch[k]=KK->StrHead[n].ch[m];
for(k=v.length+i-1,m=v.length-1;m>=0;k--,m--)KK->StrHead[n].ch[k]=v.ch[m];
}
KK->StrHead[n].length+=v.length-t.length;
i=i+v.length-1;
}
}
printf("结果串的内部名和串值为:
\n");//显示新串内容
printf("%5d",n);
Strprint(KK->StrHead[n]);
printf("\n");
if(y==1)returnTRUE;
elsereturnFALSE;
}
voidshow()//命令输入格式
{printf("输入格式如下:
\n");
printf("
(1)赋值。
格式例子:
A'hello'\n");
printf("
(2)判相等。
格式例子:
E'hello''hi'或只输入E然后根据提示操作。
\n");
printf("(3)联接。
格式例子:
C'hello''hi'或只输入C然后根据提示操作。
\n");
printf("(4)求长度。
格式例子:
L'hello'或只输入L然后根据提示操作。
\n");
printf("(5)求子串。
格式例子:
S'hello'然后根据提示操作或只输入E提示操作.\n");
printf("(6)子串定位。
格式例子:
I'hello''ll'或只输入I然后根据提示操作。
\n");
printf("(7)串替换。
格式例子:
R'hello''ll''hli'或只输入R然后根据提示操作。
\n");
printf("(8)显示。
格式例子:
只输入P然后根据提示操作。
\n");
printf("(9)删除。
格式例子:
只输入D然后根据提示操作。
\n");
printf("(Q)退出。
格式例子:
只输入Q然后根据提示操作。
\n");
}
StatusInsert(intn)//为指定内部名的串赋值
{inti,j,k=0;
chars2[50];
if(s[k]=='\'')
{i=0;
k++;
while(s[k]!
='\'')s2[i++]=s[k++];
}
else{printf("格式输入错误!
\n");returnERROR;}
if(KK->StrHead[n].ch)
{KK->StrHead[n].ch=NULL;
KK->StrHead[n].length=0;
KK->StrHead[n].state=0;
}
if(!
(KK->StrHead[n].ch=(char*)malloc(i*sizeof(char))))exit(OVERFLOW);
KK->StrHead[n].length=i;
KK->StrHead[n].state=1;
for(j=0;j<=i;j++)
KK->StrHead[n].ch[j]=s2[j];
returnOK;
}
voidgetin(intn)//处理命令串,n为要存入的串内部名
{inti,j;
while(s1[m]=='')m++;//s1为从键盘接收到的字符串,s1,m为局部变量,在getorder()函数内有效,减少需要传递的参数
if(s1[m]=='\'')
{i=0;
m++;
while(s1[m]!
='\'')s[i++]=s1[m++];
}
if(!
(KK->StrHead[n].ch=(char*)malloc(i*sizeof(char))))exit(OVERFLOW);
KK->StrHead[n].length=i;
for(j=0;j<=i;j++)
KK->StrHead[n].ch[j]=s[j];//将命令中的串值存入相应的串头表
}
函数的调用关系图(只列出部分)
四、调试分析
#include"header.h"
StrHeadKK;//定义StrHead类型的全局变量
voidmain()
{charc;
inti;
Resultp;
StatusInitResult(Resultp);//命令分析函数的初始化
Statusgetorder(Resultp);//命令处理函数
voidgetin(intn);//命令串处理函数
voidStrprint();//输出串值
voidshow();//显示输入格式
voidStrCompare(HStringS,HStringT);//串比较函数
voidConcat(HStringS1,HStringS2);//串联接函数
intStrLength(HStringS);//取串长度
StatusSubString(HStringS,intpos,intlen);//取子串
StatusReplace(HStringM,HStringt,HStringv);//子串替换
StatusIndex(HStringS,HStringT);//子串定位
StatusInsert(intn)//为指定内部名的串赋值
KK=(StrHead)malloc(sizeof(StrHeadList));//申请空间
for(i=0;i<=100;i++)
{KK->StrHead[i].ch=NULL;
KK->StrHead[i].length=0;
KK->StrHead[i].state=0;
}
KK->CurNum=0;
p=(Result)malloc(sizeof(ResultType));//申请空间
do{
printf("*********************************************\n");
printf("*串的基本操作演示系统*\n");
printf("*A.进入系统*\n");
printf("*B.输入格式*\n");
printf("*C.退出系统*\n");
printf("*********************************************\n");
scanf("%c",&c);
getchar();
switch(c)
{case'A':
InitResult(p);getorder(p);break;
case'B':
show();break;
case'C':
break;
default:
printf("输入错误,请重新输入!
\n");break;
}
}while(c!
='C');
}
chars1[100],s[50];//定义局部变量
intm;//定义局部变量
Statusgetorder(Resultp)
{
chars1[100],s[50];
inti,j,n,m;
do{
printf("请输入指令:
\n");
gets(s1);
m=0;
switch(s1[m])//判断指令类型
{case'A':
{while(KK->StrHead[KK->CurNum].state==1)KK->CurNum++;p->s[0]=KK->CurNum++;
m++;
getin(p->s[0]);//将串值赋入串头表中
printf("新串的内部名和串值为:
\n");
printf("%5d",p->s[0]);
Strprint(KK->StrHead[p->s[0]]);//回显新串
break
}
case'E':
{m++;//串比较
if(s1[m]=='\0')//比较内部已保存的串
{printf("输入第一个串的内部名:
\n");
scanf("%d",&p->s[0]);
getchar();
printf("输入第一个串的内部名:
\n");
scanf("%d",&p->s[1]);
getchar();if(p->s[0]<0||p->s[0]>=KK->CurNum||p->s[1]<0||p->s[1]>=KK->CurNum)
printf("超出当前串的范围\n");
else
{StrCompare(KK->StrHead[p->s[0]],KK->StrHead[p->s[1]]);}
}
else{while(KK->StrHead[KK->CurNum].state==1)KK->CurNum++;
p->s[0]=KK->CurNum++;
while(KK->StrHead[KK->CurNum].state==1)KK->CurNum++;
p->s[1]=KK->CurNum++;
getin(p->s[0]);
m++;
getin(p->s[1]);
StrCompare(KK->StrHead[p->s[0]],KK->StrHead[p->s[1]]);
}
break;
}
case'C':
{m++;//串联接
if(s1[m]=='\0')//联接内部已存在的串
{printf("输入第一个串的内部名:
\n");
scanf("%d",&p->s[0]);
getchar();
printf("输入第二个串的内部名:
\n");
scanf("%d",&p->s[1]);
getchar();
if(p->s[0]<0||p->s[0]>=KK->CurNum||p->s[1]<0||p->s[1]>=KK->CurNum)
printf("超出当前串的范围\n");
else
{Concat(KK->StrHead[p->s[0]],KK->StrHead[p->s[1]]);}
}
else
{while(KK->StrHead[KK->CurNum].state==1)KK->CurNum++;
p->s[0]=KK->CurNum++;
while(KK->StrHead[KK->CurNum].state==1)K