#include<stdio.h>
#define MAXSIZE 100
typedef struct
{
char ch[MAXSIZE];
int Len;
}String;
void StrCreate(String* S1)//串1与串2的创建
{
gets(S1->ch);
S1->Len = StrLength(S1);
}
int StrCat(String* S1, String* S2)//字符串的连接
{
int i, flag;
if (S1->Len + S2->Len <= MAXSIZE)
{
for (i = S1->Len - 1; i < S1->Len + S2->Len - 2; i++)
S1->ch[i] = S2->ch[i - S1->Len + 1];
S1->ch[i] = '#';
S1->Len += S2->Len;
flag = 1;
}
else if(S1->Len<=MAXSIZE)
{
for(i=S1->Len;i<MAXSIZE;i++)
S1->ch[i]=S2->ch[i-S1->Len];
S1->Len=MAXSIZE;
flag=0;
}
else
flag=0;
return(flag);
}
int StrCompare(String* S2, String* S3)//字符串的比较
{
int i = 0, flag = 0;
while(S2->ch[i]!='#' && S3->ch[i]!='#')
{
if(S2->ch[i]!=S3->ch[i])
{ flag=1;break; }
else
i++;
}
if(flag==0 && S2->Len==S3->Len)
return 0;
else
return S2->ch[i]-S3->ch[i];
}
int StrLength(String* S1)//求串的长度
{
int i = 0;
while (S1->ch[i] != '#')
i++;
S1->Len = i;
return(S1->Len);
}
int SubString(String* S1, String* Sub, int pos, int len)//求串的子串
{
int j;
if (pos<1 || pos>S1->Len || len<1 || len>S1->Len - pos + 1)
{
Sub->Len = 0;
printf("参数错误!\n");
return 0;
}
else
{
for (j = 0 ; j < len; j++)
Sub->ch[j] = S1->ch[pos + j - 1];
Sub->ch[j] = '\0';
Sub->Len = len;
return 1;
}
}
int Strmatch(String *S1, String *S2)//串的匹配
{
int i=0;
int j=0;
while(i<=S1->Len && j<=S2->Len)
{
if (S1->ch[i] == S2->ch[j])
{
i++; j++;
}
else
{
i = i - j + 2; j = 1;
}
}
if(j==S2->Len)
return i-S2->Len;
else
return -1;
}
void MenuString()//菜单
{
printf("**********************************\n");
printf(" 串的应用\n");
printf("**********************************\n");
printf("\n");
printf(" 1、字符串的连接\n");
printf(" 2、字符串的比较\n");
printf(" 3、求串的长度\n");
printf(" 4、求串的子串\n");
printf(" 5、串的匹配\n");
printf(" 0、退出\n");
printf("\n");
printf(" 请按数字0~5选择功能:\n");
}
void main()
{
int i=0, len=0, flag=0;
int pos=0;
String x, y, z;
String* S1 = &x, * S2 = &y,*S3= &z;
char ch1, ch2, a;
ch1 = 'y';
while (ch1 == 'y' || ch1 == 'Y')
{
MenuString();
scanf("%c",&ch2);
getchar();
switch (ch2)
{
case '1':
printf("请输入第一个串(以#结尾):");
CreateStr(S1);
printf("请输入第二个串(以#结尾):");
CreateStr(S2);
flag=StrCat(S1,S2);
if(flag)
{
printf("连接以后的新串值为:");
puts(S1->ch);
}
else
printf("连接失败!");
break;
case '2':
printf("请输入第一个串(以#结尾):");
CreateStr(S1);
printf("请输入第二个串(以#结尾):");
CreateStr(S2);
flag=StrCompare(S1,S2);
if(flag>0)
printf("第一个串大!");
else if(flag<0)
printf("第二个串大!");
else
printf("两个串相等!");
break;
case '3':
printf("当前串的长度为:%d",StrLength(S1));
case '4':
printf("请输入从第几个字符开始求子串:");
scanf("%d,&i");
printf("请输入取出的子串长度:");
scanf("%d",&len);
flag=SubString(S1,S2,i,len);
if(flag)
{
printf("求子串成功!原来主串为:");
puts(S1->ch);
}
else
printf("求子串失败!");
break;
case '5':
printf("请输入第一个串(以#结尾):");
CreateStr(S1);
printf("请输入第二个串(以#结尾):");
CreateStr(S2);
pos=Strmatch(S1,S2);
if(pos!=-1)
printf("匹配成功,子串在主串下标为%d的位置开始出现\n",pos);
else
printf("匹配失败,子串不存在于主串中!");
case '0':
ch1 = 'n';
break;
default:
printf("输入有误,请输入0~5进行选择!");
}
if (ch2 != '0')
{
printf("\n按回车键继续,按任意键返回主菜单!\n");
a = getchar();
if (a != '\xA')
{
getchar(); ch1 = 'n';
}
}
}
}
#define MAXSIZE 100
typedef struct
{
char ch[MAXSIZE];
int Len;
}String;
void StrCreate(String* S1)//串1与串2的创建
{
gets(S1->ch);
S1->Len = StrLength(S1);
}
int StrCat(String* S1, String* S2)//字符串的连接
{
int i, flag;
if (S1->Len + S2->Len <= MAXSIZE)
{
for (i = S1->Len - 1; i < S1->Len + S2->Len - 2; i++)
S1->ch[i] = S2->ch[i - S1->Len + 1];
S1->ch[i] = '#';
S1->Len += S2->Len;
flag = 1;
}
else if(S1->Len<=MAXSIZE)
{
for(i=S1->Len;i<MAXSIZE;i++)
S1->ch[i]=S2->ch[i-S1->Len];
S1->Len=MAXSIZE;
flag=0;
}
else
flag=0;
return(flag);
}
int StrCompare(String* S2, String* S3)//字符串的比较
{
int i = 0, flag = 0;
while(S2->ch[i]!='#' && S3->ch[i]!='#')
{
if(S2->ch[i]!=S3->ch[i])
{ flag=1;break; }
else
i++;
}
if(flag==0 && S2->Len==S3->Len)
return 0;
else
return S2->ch[i]-S3->ch[i];
}
int StrLength(String* S1)//求串的长度
{
int i = 0;
while (S1->ch[i] != '#')
i++;
S1->Len = i;
return(S1->Len);
}
int SubString(String* S1, String* Sub, int pos, int len)//求串的子串
{
int j;
if (pos<1 || pos>S1->Len || len<1 || len>S1->Len - pos + 1)
{
Sub->Len = 0;
printf("参数错误!\n");
return 0;
}
else
{
for (j = 0 ; j < len; j++)
Sub->ch[j] = S1->ch[pos + j - 1];
Sub->ch[j] = '\0';
Sub->Len = len;
return 1;
}
}
int Strmatch(String *S1, String *S2)//串的匹配
{
int i=0;
int j=0;
while(i<=S1->Len && j<=S2->Len)
{
if (S1->ch[i] == S2->ch[j])
{
i++; j++;
}
else
{
i = i - j + 2; j = 1;
}
}
if(j==S2->Len)
return i-S2->Len;
else
return -1;
}
void MenuString()//菜单
{
printf("**********************************\n");
printf(" 串的应用\n");
printf("**********************************\n");
printf("\n");
printf(" 1、字符串的连接\n");
printf(" 2、字符串的比较\n");
printf(" 3、求串的长度\n");
printf(" 4、求串的子串\n");
printf(" 5、串的匹配\n");
printf(" 0、退出\n");
printf("\n");
printf(" 请按数字0~5选择功能:\n");
}
void main()
{
int i=0, len=0, flag=0;
int pos=0;
String x, y, z;
String* S1 = &x, * S2 = &y,*S3= &z;
char ch1, ch2, a;
ch1 = 'y';
while (ch1 == 'y' || ch1 == 'Y')
{
MenuString();
scanf("%c",&ch2);
getchar();
switch (ch2)
{
case '1':
printf("请输入第一个串(以#结尾):");
CreateStr(S1);
printf("请输入第二个串(以#结尾):");
CreateStr(S2);
flag=StrCat(S1,S2);
if(flag)
{
printf("连接以后的新串值为:");
puts(S1->ch);
}
else
printf("连接失败!");
break;
case '2':
printf("请输入第一个串(以#结尾):");
CreateStr(S1);
printf("请输入第二个串(以#结尾):");
CreateStr(S2);
flag=StrCompare(S1,S2);
if(flag>0)
printf("第一个串大!");
else if(flag<0)
printf("第二个串大!");
else
printf("两个串相等!");
break;
case '3':
printf("当前串的长度为:%d",StrLength(S1));
case '4':
printf("请输入从第几个字符开始求子串:");
scanf("%d,&i");
printf("请输入取出的子串长度:");
scanf("%d",&len);
flag=SubString(S1,S2,i,len);
if(flag)
{
printf("求子串成功!原来主串为:");
puts(S1->ch);
}
else
printf("求子串失败!");
break;
case '5':
printf("请输入第一个串(以#结尾):");
CreateStr(S1);
printf("请输入第二个串(以#结尾):");
CreateStr(S2);
pos=Strmatch(S1,S2);
if(pos!=-1)
printf("匹配成功,子串在主串下标为%d的位置开始出现\n",pos);
else
printf("匹配失败,子串不存在于主串中!");
case '0':
ch1 = 'n';
break;
default:
printf("输入有误,请输入0~5进行选择!");
}
if (ch2 != '0')
{
printf("\n按回车键继续,按任意键返回主菜单!\n");
a = getchar();
if (a != '\xA')
{
getchar(); ch1 = 'n';
}
}
}
}