查看代码
#include "stdio.h"
#define MAXSIZE 100
typedef struct
{
char ch[MAXSIZE];
int Len;
}String;
int StrLength(String *S)
{
int i= 0;
while(S->ch[i]!='\0')
i++;
S->Len=i;
return(S->Len);
}
void CreatStr(String *S)
{
gets(S->ch);
S->Len=StrLength(S);
}
int SubString(String *S,String *Sub,int pos,int len)
{
int j;
if(pos<1||pos>S->Len||len<1||len>S->Len-pos+1)
{
Sub->Len=0;
printf("error!\n");
return 0;
}
else
{
for(j=0;j<len;j++)
Sub->ch[j]=S->ch[pos+j-1];
Sub->ch[j]='\0';
Sub->Len=len;
return 1;
}
}
int StrDelete(String *S,int i,int l)
{
int k;
if(i+l-1>S->Len)
{
printf("error and go out");
return 0;
}
else
{
for(k=i+l-1;k<S->Len;k++,i++)
S->ch[i-1]=S->ch[k];
S->Len=S->Len-l;
S->ch[S->Len]='\0';
return 1;
}
}
int StrInsert(String *S,String *S1,int i)
{
int k;
if(i>S->Len+1)
{
printf("Insert error");
return 0;
}
else if(S->Len+S1->Len>MAXSIZE)
{
printf("两串长度超过存储空间长度");
return 0;
}
else
{
for(k=S->Len-1;k>=i-1;k--)
S->ch[S1->Len+k]=S->ch[k];
for(k=0;k<S1->Len;k++)
S->ch[i+k-1]=S1->ch[k];
S->Len=S->Len+S1->Len;
S->ch[S->Len]='\0';
return 1;
}
}
int StrIndex(String *S,String *T)
{
int i=0,j=0,k;
while(i<S->Len && j<T->Len)
{
if(S->ch[i]==T->ch[j])
{
i++;
j++;
}
else{
i=i-j+1;
j=0;
}
}
if(j>=T->Len)
k=i-T->Len+1;
else
k=-1;
return k;
}
int StrCompare(String *S1,String *S2)
{
int i=0,flag=0;
while(S1->ch[i]!='\0'&&S2->ch[i]!='\0')
{
if(S1->ch[i]!=S2->ch[i])
{
flag=1;
break;
}
else
i++;
}
if(flag==0 && S1->Len==S2->Len)
return 0;
else
return S1->ch[i]-S2->ch[i];
}
int StrCat(String *S,String *T)
{
int i,flag;
if(S->Len+T->Len<=MAXSIZE)
{
for(i=S->Len; i<S->Len+T->Len;i++)
S->ch[i]=T->ch[i-S->Len];
S->ch[i]='\0';
S->Len+=T->Len;
flag=1;
}
else if(S->Len<MAXSIZE)
{
for(i=S->Len;i<MAXSIZE;i++)
S->ch[i]=T->ch[i-S->Len];
S->Len=MAXSIZE;
flag=0;
}
else
flag=0;
return(flag);
}
void StrReplace(String *S,String *T,String *V)
{
int i,m,n,p,q;
n=S->Len;
m=T->Len;
q=V->Len;
p=1;
do{
i=StrIndex(S,T);
if(i!=-1)
{
StrDelete(S,i,m);
StrInsert(S,V,i);
p=i+q;
S->Len=S->Len+q-m;
n=S->Len;
}
}while((p<=n-m+1)&&(i!=-1));
}
void MenuString()
{
printf("\n 串子系统");
printf("\n=====================================================");
printf("\n 1--建立新串并显示该串及长度 |");
printf("\n 2--求子串 |");
printf("\n 3--删除子串 |");
printf("\n 4--插入子串 |");
printf("\n 5--查找子串 |");
printf("\n 6--比较两个串的大小 |");
printf("\n 7--连接两个串 |");
printf("\n 8--子串替换 |");
printf("\n 0--返回 |");
printf("\n=====================================================");
printf("\n请输入菜单号(0-8):");
}
main()
{
int i,len,flag;
String x,y,z;
String *S=&x, *S1=&y, *S2=&z;
char ch1,ch2,a;
ch1='y';
while(ch1=='y'||ch1=='Y')
{
MenuString();
scanf("%c",&ch2);
getchar();
switch(ch2)
{
case '1':
printf("输入一个字符串:");
CreatStr(S);
printf("该串值为:");
if(S->ch[0]=='\0')
printf("empty set");
else
{
puts(S->ch);
printf("该串的长度为:%d",S->Len);
}
break;
case '2':
printf("请输入从第几个开始");
scanf("%d",&i);
printf("请输入取出的子串长度");
scanf("%d",&len);
flag=SubString(S,S1,i,len);
if(flag)
{
printf("求子串成功,原来主串为:");
puts(S->ch);
printf("所得子串为:");
puts(S1->ch);
}
else
printf("求子串失败");
break;
case '3':
printf("请输入要删除的子串的起始位置");
scanf("%d",&i);
printf("请输入要删除的子串的长度");
scanf("%d",&len);
printf("原来串为:");
puts(S->ch);
if(flag=StrDelete(S,i,len))
{
printf("删除子串成功,删除后为");
puts(S->ch);
}
else
printf("Defeat!");
break;
case '4':
printf("请输入要插入的子串在主串的位置");
scanf("%d",&i);
printf("请输入一个子串");getchar();
CreatStr(S1);
printf("原来主串为:");
puts(S->ch);
if(flag=StrInsert(S,S1,i))
{
printf("Insert success\n");
puts(S->ch);
}
else
printf("Defeat!");
break;
case '5':
printf("请输入第一个串");
CreatStr(S);
printf("请输入第二个串");
CreatStr(S1);
i=StrIndex(S,S1);
if(i==-1)
printf("Defeat!!!");
else
printf("Success,这个子串第一次出现的位置是%d.",i);
break;
case '6':
printf("请输入第一个串");
CreatStr(S);
printf("请输入第二个串");
CreatStr(S1);
flag=StrCompare(S,S1);
if(flag>0)
printf("第一个串大!");
else if(flag<0)
printf("第二个串大!");
else
printf("两个串一样大!");
case '7':
printf("请输入第一个串");
CreatStr(S);
printf("请输入第二个串");
CreatStr(S1);
flag=StrCat(S,S1);
if(flag)
{
printf("连接之后为:");
puts(S->ch);
}
else
printf("Defeat!!");
break;
case '8':
printf("请输入主串");
CreatStr(S);
printf("请输入在主串查找的子串");
CreatStr(S1);
printf("请输入要替换的子串");
CreatStr(S2);
StrReplace(S,S1,S2);
printf("替换后的主串为");
puts(S->ch);
break;
case '0':
ch1='n';
break;
default:
printf("error!");
}
if(ch2!='0')
{
printf("\n按回车键继续");
a=getchar();
if(a!='\xA')
{
getchar();ch1='n';
}
}
}
}