串的基本操作演示

问题描述: 如果语言没有把串作为一个预先定义好的基本类型对待,又需要用该语言写一个涉及串操作的软件系统时,用户必须自己实现串类型。试实现串类型,并写一个串的基本操作的演示系统。
基本要求: 在教科书4.2.2节用堆分配存储表示实现HString串的最小操作子集的基础上,实现串抽象数据类型的其余基本操作(不使用C语言本身提供的串函数)。参数合法性检查必须严格。 说明:(在格式中,Φ表示0个、1个或多个空格所组成的串。〈串标识〉表示一个内部名或一个串文字。前者是一个串的唯一标识,是一种内部形式的(而不是字符形式的)标识符。后者是两端由单引号括起来的仅可打印字符组成的序列。串内每两个连续的单引号表示一个单引号符。)
利用上述基本操作函数构造以下系统:它是一个命令解释程序,循环往复地处理用户键入的每一条命令,直至终止程序的命令为止。命令定义如下:
(1) 赋值。格式:AΦ〈串标识〉Φ〈回车〉
用〈串标识〉所表示的值建立新串,并显示新串的内部名和串值。如:A′Hi!′
(2) 判相等。 格式:EΦ〈串标识1〉Φ〈串标识2〉Φ〈回车〉
若两串相等,则显示“EQUAL”,否则显示“UNEQUAL”。
(3) 联接。 格式:CΦ〈串标识1〉Φ〈串标识2〉Φ〈回车〉
将两串联接产生结果串,它的内部名和串值都显示出来。
(4) 求长度 格式:LΦ〈串标识〉Φ〈回车〉 显示串的长度。
(5) 求子串 格式:SΦ〈串标识〉Φ+〈数1〉Φ+〈数2〉Φ〈回车〉
如果参数合法,则显示子串的内部名和串值。〈数〉不带正负号。
(6)子串定位。 格式:IΦ〈串标识1〉Φ〈串标识2〉Φ〈回车〉
显示第二个串在第一个串中首次出现时的位置。
(7)串替换 格式:RΦ〈串标识1〉Φ〈串标识2〉Φ〈串标识2〉Φ〈回车〉
将第一个串中出现所有出现的第二个串用第三个串替换,显示结果串的内部名和串值,原串不变。
(8)显示 格式:PΦ〈回车〉 显示所有在系统中被保持的串的内部名和串值的对照表。
(9)删除 格式:DΦ〈内部名〉Φ〈回车〉 删除该内部名对应的的串,即赋值的逆操作。
(10)退出 格式:QΦ〈回车〉 结束程序的运行。
在上述命令中,如果一个自变量是串,则应首先建立它。基本操作函数的结果(即函数值)如果是一个串,则应在尚未分配的区域内新辟空间存放。

不过在程序中第8个函数(8)显示 我省略输入了,每次输入之前都显示所有的串标示的数据

一下就是程序代码

#include
#include
#define NULL 0
typedef struct
{
char *ch;
int length;
}hstring;
hstring A,B,C,D,E,F,G

;
main()
{
void operation(void);
void initstring(hstring *s);
initstring(&A);
initstring(&B);
initstring(&C);
initstring(&D);
initstring(&E);
initstring(&F);
initstring(&G);
printf(" \n");
operation();
}
void initstring(hstring *s)/*初始化*/
{
s->ch=NULL;
s->length=0;
}
void operation(void)
{
void show(void);/*显示*/
void strassign(void);/*赋值*/
void equality(void);/*判断相等*/
void concat(void);/*联接*/
void strleng(void);/*求串长*/
void substring(void);/*求子串*/
void index(void);/*字串定位*/
void replace(void);/*串替换*/
void strdelete(void);/*串删除*/
void quit(void);/*退出程序*/
int flag1=1,flag2=1;
char ch;
while(flag1)
{
show();
while(flag2)
{
printf("请选择要进行的操作\nA赋值,E判相等,C联接,L求长度,S求子串,I字串定位,R串替换,D删除串,Q退出程序.\n");
fflush(stdin);
scanf("%c",&ch);
switch(ch)
{
case 'a':strassign(),flag2=0;break;
case 'A':strassign(),flag2=0;break;
case 'e':equality(),flag2=0;break;
case 'E':equality(),flag2=0;break;
case 'c':concat(),flag2=0;break;
case 'C':concat(),flag2=0;break;
case 'l':strleng(),flag2=0;break;
case 'L':strleng(),flag2=0;break;
case 's':substring(),flag2=0;break;
case 'S':substring(),flag2=0;break;
case 'i':index(),flag2=0;break;
case 'I':index(),flag2=0;break;
case 'r':replace(),flag2=0;break;
case 'R':replace(),flag2=0;break;
case 'd':strdelete(),flag2=0;break;
case 'D':strdelete(),flag2=0;break;
case 'q':quit(),flag2=0;break;
case 'Q':quit(),flag2=0;break;
default :printf("输入格式错误,请重新输入.\n");
}
}
flag2=1;
printf("还继续进行计算么?(y/n)\n");
while(flag2)
{
fflush(stdin);
scanf("%c",&ch);
if(ch=='n'||ch=='N')
{
flag1=0;
flag2=0;
}
else if(ch=='y'||ch=='Y')
{
flag2=0;
system("cls");
}
else
printf("输入格式错误,请重新输入.\n");
}
flag2=1;
}
}
void show(void)/*显示*/
{
printf("\n串标示已使用情况.\n");
if(A.ch==NULL)
printf("A标示未使用.\n");
else
printf("A串标示内容为“%s”,A串标示长度为%d.\n",A.ch,A.length);
if(B.ch==NULL)
printf("B标示未使用.\n");
else
printf("B串标示内容为“%s”,B串标示长度为%d.\n",B.ch,B.length);
if(C.ch==NULL)
printf("C标示未使用.\n");
else
printf("C串标示内容为“%s”,C串标示长度为%d.\n",C.ch,C.length);
if(D.ch==NULL)
printf("D标示未使用.\n");
else
printf("D串标示内容为“%s”,D串标示长度为%d.\n",D.ch,D.length);
if(E.ch==NULL)
printf("E标示未使用.\n");
else
printf("E串标示内容为“%s”,E串标示长度为%d.\n",E.ch,E.length);
if(F.ch==NULL)
printf("F标示未使用.\n");
else
printf("F串标示内容为“%s”,F串标示长度为%d.\n"

,F.ch,F.length);
if(G.ch==NULL)
printf("G标示未使用.\n");
else
printf("G串标示内容为“%s”,G串标示长度为%d.\n",G.ch,G.length);
}
void strassign(void)/*赋值*/
{
hstring *s;
char ch[100],*c,hc;
int flag1=1,i,j;
printf("请输入要给与赋值的串标示");
while(flag1)
{
fflush(stdin);
scanf("%c",&hc);
switch(hc)
{
case 'a':s=&A;flag1=0;break;
case 'A':s=&A,flag1=0;break;
case 'b':s=&B,flag1=0;break;
case 'B':s=&B,flag1=0;break;
case 'c':s=&C,flag1=0;break;
case 'C':s=&C,flag1=0;break;
case 'd':s=&D,flag1=0;break;
case 'D':s=&D,flag1=0;break;
case 'e':s=&E,flag1=0;break;
case 'E':s=&E,flag1=0;break;
case 'f':s=&F,flag1=0;break;
case 'F':s=&F,flag1=0;break;
case 'g':s=&G,flag1=0;break;
case 'G':s=&G,flag1=0;break;
default :printf("输入格式错误,请重新输入.\n");
}
}
printf("请输入要赋予的值.\n");
fflush(stdin);
scanf("%s",ch);
if(s->ch)
free(s->ch);
c=ch;
i=0;
while(*c)
{c++;i++;}
if(!i)
{
s->length=0;
s->ch=NULL;
}
else
{
if(!(s->ch=(char *)malloc(i*sizeof(char)+1)))
exit(1);
for(j=0;js->ch[j]=ch[j];
s->ch[j]='\0';
s->length=i;
}
}
void equality(void)/*判断相等*/
{
char hc;
int flag1=1,i,j,k;
hstring *s1,*s2;
printf("请输入第一个串标识\n");
while(flag1)
{
fflush(stdin);
scanf("%c",&hc);
switch(hc)
{
case 'a':s1=&A;flag1=0;break;
case 'A':s1=&A,flag1=0;break;
case 'b':s1=&B,flag1=0;break;
case 'B':s1=&B,flag1=0;break;
case 'c':s1=&C,flag1=0;break;
case 'C':s1=&C,flag1=0;break;
case 'd':s1=&D,flag1=0;break;
case 'D':s1=&D,flag1=0;break;
case 'e':s1=&E,flag1=0;break;
case 'E':s1=&E,flag1=0;break;
case 'f':s1=&F,flag1=0;break;
case 'F':s1=&F,flag1=0;break;
case 'g':s1=&G,flag1=0;break;
case 'G':s1=&G,flag1=0;break;
default :printf("输入格式错误,请重新输入.\n");
}
}
flag1=1;
printf("请输入第2个串标示\n");
while(flag1)
{
fflush(stdin);
scanf("%c",&hc);
switch(hc)
{
case 'a':s2=&A;flag1=0;break;
case 'A':s2=&A,flag1=0;break;
case 'b':s2=&B,flag1=0;break;
case 'B':s2=&B,flag1=0;break;
case 'c':s2=&C,flag1=0;break;
case 'C':s2=&C,flag1=0;break;
case 'd':s2=&D,flag1=0;break;
case 'D':s2=&D,flag1=0;break;
case 'e':s2=&E,flag1=0;break;
case 'E':s2=&E,flag1=0;break;
case 'f':s2=&F,flag1=0;break;
case 'F':s2=&F,flag1=0;break;
case 'g':s2=&G,flag1=0;break;
case 'G':s2=&G,flag1=0;break;
default :printf("输入格式错误,请重新输入.\n");
}
}
for(i=0,j=0,k=1;ilength&&jlength&&k;i++,j++)
if(s1->ch[i]!=s2->ch[j])
{
printf("UNEQUAL(不相等)\n");
k=0;
}
if(i==s2->length&&j==s1->length&&k==1)
printf("EQUAL(相等)\n");
else
printf("UNEQUAL(不相等)\n");
}
void concat(void)/*联接*/
{

char hc;
int

flag1=1,i,j;
hstring *s1,*s2,*s3;
printf("请输入第一个串标识\n");
while(flag1)
{
fflush(stdin);
scanf("%c",&hc);
switch(hc)
{
case 'a':s1=&A;flag1=0;break;
case 'A':s1=&A,flag1=0;break;
case 'b':s1=&B,flag1=0;break;
case 'B':s1=&B,flag1=0;break;
case 'c':s1=&C,flag1=0;break;
case 'C':s1=&C,flag1=0;break;
case 'd':s1=&D,flag1=0;break;
case 'D':s1=&D,flag1=0;break;
case 'e':s1=&E,flag1=0;break;
case 'E':s1=&E,flag1=0;break;
case 'f':s1=&F,flag1=0;break;
case 'F':s1=&F,flag1=0;break;
case 'g':s1=&G,flag1=0;break;
case 'G':s1=&G,flag1=0;break;
default :printf("输入格式错误,请重新输入.\n");
}
}
flag1=1;
printf("请输入第2个串标示\n");
while(flag1)
{
fflush(stdin);
scanf("%c",&hc);
switch(hc)
{
case 'a':s2=&A;flag1=0;break;
case 'A':s2=&A,flag1=0;break;
case 'b':s2=&B,flag1=0;break;
case 'B':s2=&B,flag1=0;break;
case 'c':s2=&C,flag1=0;break;
case 'C':s2=&C,flag1=0;break;
case 'd':s2=&D,flag1=0;break;
case 'D':s2=&D,flag1=0;break;
case 'e':s2=&E,flag1=0;break;
case 'E':s2=&E,flag1=0;break;
case 'f':s2=&F,flag1=0;break;
case 'F':s2=&F,flag1=0;break;
case 'g':s2=&G,flag1=0;break;
case 'G':s2=&G,flag1=0;break;
default :printf("输入格式错误,请重新输入.\n");
}
}
flag1=1;
printf("请输入合并之后的串标示\n");
while(flag1)
{
fflush(stdin);
scanf("%c",&hc);
switch(hc)
{
case 'a':s3=&A;flag1=0;break;
case 'A':s3=&A,flag1=0;break;
case 'b':s3=&B,flag1=0;break;
case 'B':s3=&B,flag1=0;break;
case 'c':s3=&C,flag1=0;break;
case 'C':s3=&C,flag1=0;break;
case 'd':s3=&D,flag1=0;break;
case 'D':s3=&D,flag1=0;break;
case 'e':s3=&E,flag1=0;break;
case 'E':s3=&E,flag1=0;break;
case 'f':s3=&F,flag1=0;break;
case 'F':s3=&F,flag1=0;break;
case 'g':s3=&G,flag1=0;break;
case 'G':s3=&G,flag1=0;break;
default :printf("输入格式错误,请重新输入.\n");
}
}
if(s3->ch)
free(s3->ch);
s3->length=s1->length+s2->length;
if(!(s3->ch=(char *)malloc((s1->length+s2->length)*sizeof(char)+1)))
exit(1);
for(i=0;ilength;i++)
s3->ch[i]=s1->ch[i];
for(j=0;jlength;j++)
s3->ch[i++]=s2->ch[j];
s3->ch[i]='\0';
}
void strleng(void)/*求串长*/
{
int flag1=1;
char hc;
printf("请输入串的串标示\n");
while(flag1)
{
fflush(stdin);
scanf("%c",&hc);
switch(hc)
{
case 'a':printf("%d\n",A.length),flag1=0;break;
case 'A':printf("%d\n",A.length),flag1=0;break;
case 'b':printf("%d\n",B.length),flag1=0;break;
case 'B':printf("%d\n",B.length),flag1=0;break;
case 'c':printf("%d\n",C.length),flag1=0;break;
case 'C':printf("%d\n",C.length),flag1=0;break;
case 'd':printf("%d\n",D.length),flag1=0;break;
case 'D':printf("%d\n",D.length),flag1=0;break;
case 'e':printf("%d\n",E.length),flag1=0;break;
case 'E':pr

intf("%d\n",E.length),flag1=0;break;
case 'f':printf("%d\n",F.length),flag1=0;break;
case 'F':printf("%d\n",F.length),flag1=0;break;
case 'g':printf("%d\n",G.length),flag1=0;break;
case 'G':printf("%d\n",G.length),flag1=0;break;
default :printf("输入格式错误,请重新输入.\n");
}
}
}
void substring(void)/*求子串*/
{
int flag1=1,i,j,k;
char hc,ch[100];
hstring *s1,*s2;
printf("请输入要求字串的串标示\n");
while(flag1)
{
fflush(stdin);
scanf("%c",&hc);
switch(hc)
{
case 'a':s1=&A;flag1=0;break;
case 'A':s1=&A,flag1=0;break;
case 'b':s1=&B,flag1=0;break;
case 'B':s1=&B,flag1=0;break;
case 'c':s1=&C,flag1=0;break;
case 'C':s1=&C,flag1=0;break;
case 'd':s1=&D,flag1=0;break;
case 'D':s1=&D,flag1=0;break;
case 'e':s1=&E,flag1=0;break;
case 'E':s1=&E,flag1=0;break;
case 'f':s1=&F,flag1=0;break;
case 'F':s1=&F,flag1=0;break;
case 'g':s1=&G,flag1=0;break;
case 'G':s1=&G,flag1=0;break;
default :printf("输入格式错误,请重新输入.\n");
}
}
flag1=1;
while(flag1)
{
printf("请输入求子串的起始位置\n");
fflush(stdin);
scanf("%d",&i);
if(i>0&&i<=s1->length)
flag1=0;
else
printf("输入超过范围,\n");
}
flag1=1;
while(flag1)
{
printf("请输入要求得字串的终止位置\n");
fflush(stdin);
scanf("%d",&j);
if(j>i&&jlength)
flag1=0;
else
printf("输入超过范围,\n");
}
flag1=1;
printf("请输入要存放字串的串标示\n");
while(flag1)
{
fflush(stdin);
scanf("%c",&hc);
switch(hc)
{
case 'a':s2=&A;flag1=0;break;
case 'A':s2=&A,flag1=0;break;
case 'b':s2=&B,flag1=0;break;
case 'B':s2=&B,flag1=0;break;
case 'c':s2=&C,flag1=0;break;
case 'C':s2=&C,flag1=0;break;
case 'd':s2=&D,flag1=0;break;
case 'D':s2=&D,flag1=0;break;
case 'e':s2=&E,flag1=0;break;
case 'E':s2=&E,flag1=0;break;
case 'f':s2=&F,flag1=0;break;
case 'F':s2=&F,flag1=0;break;
case 'g':s2=&G,flag1=0;break;
case 'G':s2=&G,flag1=0;break;
default :printf("输入格式错误,请重新输入.\n");
}
}
for(k=0;i<=j;i++,k++)
ch[k]=s1->ch[i-1];
ch[k]='\0';
if(s2->ch)
free(s2->ch);
if(!k)
{
s2->length=0;
s2->ch=NULL;
}
else
{
if(!(s2->ch=(char *)malloc(k*sizeof(char)+1)))
exit(1);
for(j=0;js2->ch[j]=ch[j];
s2->ch[j]='\0';
s2->length=k;
}
}
void index(void)/*字串定位*/
{
int i,j,pos,flag1=1;
char hc;
hstring *t,*s;
printf("请输入主串的标识符\n");
while(flag1)
{
fflush(stdin);
scanf("%c",&hc);
switch(hc)
{
case 'a':t=&A;flag1=0;break;
case 'A':t=&A,flag1=0;break;
case 'b':t=&B,flag1=0;break;
case 'B':t=&B,flag1=0;break;
case 'c':t=&C,flag1=0;break;
case 'C':t=&C,flag1=0;break;
case 'd':t=&D,flag1=0;break;
case 'D':t=&D,flag1=0;break;
case 'e':t=&E,flag1=0;break;

case 'E':t=&E,flag1=0;break;
case 'f':t=&F,flag1=0;break;
case 'F':t=&F,flag1=0;break;
case 'g':t=&G,flag1=0;break;
case 'G':t=&G,flag1=0;break;
default :printf("输入格式错误,请重新输入.\n");
}
}
flag1=1;
printf("请输入要求得的字串的标识符\n");
while(flag1)
{
fflush(stdin);
scanf("%c",&hc);
switch(hc)
{
case 'a':s=&A;flag1=0;break;
case 'A':s=&A,flag1=0;break;
case 'b':s=&B,flag1=0;break;
case 'B':s=&B,flag1=0;break;
case 'c':s=&C,flag1=0;break;
case 'C':s=&C,flag1=0;break;
case 'd':s=&D,flag1=0;break;
case 'D':s=&D,flag1=0;break;
case 'e':s=&E,flag1=0;break;
case 'E':s=&E,flag1=0;break;
case 'f':s=&F,flag1=0;break;
case 'F':s=&F,flag1=0;break;
case 'g':s=&G,flag1=0;break;
case 'G':s=&G,flag1=0;break;
default :printf("输入格式错误,请重新输入.\n");
}
}
flag1=1;
while(flag1)
{
printf("请输入要查找的起始位置\n");
fflush(stdin);
scanf("%d",&pos);
if(pos<1||pos>s->length)
printf("输入错误,");
else
flag1=0;
}
i=pos-1,j=0;
while(ilength&&jlength)
{
if(t->ch[i]==s->ch[j]){i++,j++;}
else
{i=i-j+1;j=0;}
}
if(j==s->length)
printf("位置在%d\n",i-j+1);
else
printf("未找到\n");
}
void replace(void)/*串替换*/
{
int i=0,j=0,k=0,*abc,l,flag1=1;
char hc;
hstring *s,*t,*v;
printf("请输入主串的串标识\n");
while(flag1)
{
fflush(stdin);
scanf("%c",&hc);
switch(hc)
{
case 'a':s=&A;flag1=0;break;
case 'A':s=&A,flag1=0;break;
case 'b':s=&B,flag1=0;break;
case 'B':s=&B,flag1=0;break;
case 'c':s=&C,flag1=0;break;
case 'C':s=&C,flag1=0;break;
case 'd':s=&D,flag1=0;break;
case 'D':s=&D,flag1=0;break;
case 'e':s=&E,flag1=0;break;
case 'E':s=&E,flag1=0;break;
case 'f':s=&F,flag1=0;break;
case 'F':s=&F,flag1=0;break;
case 'g':s=&G,flag1=0;break;
case 'G':s=&G,flag1=0;break;
default :printf("输入格式错误,请重新输入.\n");
}
}
flag1=1;
printf("请输入主串中的字串(被替换的字串)\n");
while(flag1)
{
fflush(stdin);
scanf("%c",&hc);
switch(hc)
{
case 'a':t=&A;flag1=0;break;
case 'A':t=&A,flag1=0;break;
case 'b':t=&B,flag1=0;break;
case 'B':t=&B,flag1=0;break;
case 'c':t=&C,flag1=0;break;
case 'C':t=&C,flag1=0;break;
case 'd':t=&D,flag1=0;break;
case 'D':t=&D,flag1=0;break;
case 'e':t=&E,flag1=0;break;
case 'E':t=&E,flag1=0;break;
case 'f':t=&F,flag1=0;break;
case 'F':t=&F,flag1=0;break;
case 'g':t=&G,flag1=0;break;
case 'G':t=&G,flag1=0;break;
default :printf("输入格式错误,请重新输入.\n");
}
}
flag1=1;
printf("请输入主串中的字串要被替换成的串标示\n");
while(flag1)
{
fflush(stdin);
scanf("%c",&hc);
switch(hc)
{
case

'a':v=&A;flag1=0;break;
case 'A':v=&A,flag1=0;break;
case 'b':v=&B,flag1=0;break;
case 'B':v=&B,flag1=0;break;
case 'c':v=&C,flag1=0;break;
case 'C':v=&C,flag1=0;break;
case 'd':v=&D,flag1=0;break;
case 'D':v=&D,flag1=0;break;
case 'e':v=&E,flag1=0;break;
case 'E':v=&E,flag1=0;break;
case 'f':v=&F,flag1=0;break;
case 'F':v=&F,flag1=0;break;
case 'g':v=&G,flag1=0;break;
case 'G':v=&G,flag1=0;break;
default :printf("输入格式错误,请重新输入.\n");
}
}
if(s->lengthlength||v->length==0)
exit(1);
if(!(abc=(int *)malloc(s->length/t->length*sizeof(int))))
exit(1);
while(ilength)
{
if(s->ch[i]==t->ch[j])
{
i++;
j++;
if(j==t->length)
{
j=0;
abc[k]=i-1;
k++;
}
}
else
{
i=i-j+1;
j=0;
}
}
if(k==0)
{
printf("未找到匹配的子串");
exit(1);
}
if(t->lengthlength)
{
if(!(s->ch=(char *)realloc(s->ch,(s->length+k*(v->length-t->length))*sizeof(char)+1)))
exit(1);
for(l=0;l{
for(i=s->length+1;i>abc[l];i--)
s->ch[i+v->length-t->length]=s->ch[i];
for(i=0;ilength;i++)
s->ch[abc[l]-t->length+i+1]=v->ch[i];
abc[l+1]=abc[l+1]-t->length+v->length;
}
}
else
{
for(l=0;l{
for(i=abc[l];i<=s->length;i++)
s->ch[i-t->length+v->length]=s->ch[i];
for(i=0;ilength;i++)
s->ch[abc[l]-t->length+i+1]=v->ch[i];
abc[l+1]=abc[l+1]-t->length+v->length;
}
}
}
void strdelete(void)/*串删除*/
{
int flag1=1;
hstring *s;
char hc;
printf("请输入要删除的串标示\n");
while(flag1)
{
fflush(stdin);
scanf("%c",&hc);
switch(hc)
{
case 'a':s=&A;flag1=0;break;
case 'A':s=&A,flag1=0;break;
case 'b':s=&B,flag1=0;break;
case 'B':s=&B,flag1=0;break;
case 'c':s=&C,flag1=0;break;
case 'C':s=&C,flag1=0;break;
case 'd':s=&D,flag1=0;break;
case 'D':s=&D,flag1=0;break;
case 'e':s=&E,flag1=0;break;
case 'E':s=&E,flag1=0;break;
case 'f':s=&F,flag1=0;break;
case 'F':s=&F,flag1=0;break;
case 'g':s=&G,flag1=0;break;
case 'G':s=&G,flag1=0;break;
default :printf("输入格式错误,请重新输入.\n");
}
}
if(s->ch)
free(s->ch);
s->ch=NULL;
s->length=0;
}
void quit(void)/*退出程序*/
{
printf("退出程序\n");
exit(1);
}

相关文档
最新文档