您的位置:首页 > 其它

串的基本操作

2015-10-30 15:39 309 查看
#include<stdio.h>
#define MAXSTRLEN 255
#define TRUE 1
#define FALSE 0
#define OK 1
typedef int Status;
typedef unsigned char SString[MAXSTRLEN+1];

Status StrAssign(SString &T,char *chars);//串赋值,生成一个其值等于chars的串T
Status StrCopy(SString &T,SString S);//串复制,由串S复制得串T
int StrCompare(SString S,SString T);//串比较,若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0;
int StrLength(SString S);//返回S的元素个数,称为串的长度
Status Concat(SString &T,SString S1,SString S2);//用T返回有S1和S2联接而成的新串。若未截断,则返回TRUE,否则返回FALSE
Status SubString(SString &Sub,SString S,int pos,int len);//用Sub返回串S的第pos个字符起长度为len的子串
int Index(SString S,SString T,int pos);//T为非空串,若主串S中第pos个字符之后存在与T相等的子串,则返回第一个这样的子串在S中的位置,否则返回0
void PrintStr(SString S);//输出串的值
void PrintMenu();
int main()
{
SString S1,S2,S3;
int i,pos,len;
char chars[MAXSTRLEN];
int z=1;
int cdh;//选择的菜单号
while(z)
{
do{
PrintMenu();
scanf("%d",&cdh);
if(cdh<0||cdh>6)
printf("菜单号输入错误,请重新输入!\n");
}while(cdh<0||cdh>6);
getchar();
switch(cdh){
case 0:
z=0;
break;
case 1://串复制
printf("串复制,把S1复制到S2---------------------\n");
printf("请输入串S1的值:");
gets(chars);
StrAssign(S1,chars);
if(StrCopy(S2,S1))
{
printf("复制成功!串S2的长度是:%d;\n值是:",StrLength(S2));
PrintStr(S2);
}
break;
case 2://串比较
printf("串比较,比较串S1和S2的大小----------------------------\n");
printf("请输入串S1的值:");
gets(chars);
StrAssign(S1,chars);
printf("请输入串S2的值:");
gets(chars);
StrAssign(S2,chars);
i=StrCompare(S1,S2);
if(i>0)
printf("比较结果:S1大于S2。\n");
else if(i==0)
printf("比较结果:S1等于S2。\n");
else
printf("比较结果:S1小于S2。\n");
break;
case 3://求串长
printf("求串长------------------------------\n");
printf("请输入串S1的值:");
gets(chars);
StrAssign(S1,chars);
printf("串长是:%d\n",StrLength(S1));
break;
case 4://串联接
printf("串联接------------------------------\n");
printf("请输入串S1的值:");
gets(chars);
StrAssign(S1,chars);
printf("请输入串S2的值:");
gets(chars);
StrAssign(S2,chars);
if(Concat(S3,S1,S2)) printf("S2没有被截断;");
else printf("S2被截断;");
printf("联接结果:\n");
PrintStr(S3);
break;
case 5://求子串
printf("求子串--------------------------------\n");
printf("请输入主串:\n");
gets(chars);
StrAssign(S1,chars);
printf("请输入起始位置pos:\n");
scanf("%d",&pos);
printf("请输入所求子串长度len:\n");
scanf("%d",&len);
if(SubString(S2,S1,pos,len))
{
printf("求子串成功!子串是:\n");
PrintStr(S2);
}
else
printf("求子串失败!\n");
break;
case 6://求子串在主串中的位置
printf("求子串在主串中的位置-----------------------------------\n");
printf("请输入主串:\n");
gets(chars);
StrAssign(S1,chars);
printf("请输入子串:\n");
gets(chars);
StrAssign(S2,chars);
printf("请输入起始位置pos:\n");
scanf("%d",&pos);
i=Index(S1,S2,pos);
if(i)
{
printf("找到了,子串在主串第%d个字符之后第一次出现的位置是%d。\n",pos,i);
}
else
printf("子串在主串第%d个字符之后未出现。\n",pos);
break;
}
}
return 0;
}
Status StrAssign(SString &T,char *chars)//串赋值,生成一个其值等于chars的串T
{
int i=0;
while(chars[i]!='\0')//括号中的条件也可略写为chars[i]
{
T[i+1]=chars[i];
i++;
}
T[0]=i;
return OK;
}
Status StrCopy(SString &T,SString S)//串复制,由串S复制得串T
{
int i;
for(i=0;i<=S[0];i++)
T[i]=S[i];
return OK;
}
int StrCompare(SString S,SString T)//串比较,若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0;
{
int i=1;
while(i<=S[0]&&i<=T[0])
{
if(S[i]==T[i])
i++;
else
return (S[i]-T[i]);
}
if(i>S[0]&&i>T[0])//两个字符串都比到最后一个字符并且对应字符都相等,两个串相等
return 0;
else if(i>S[0])//串S比T短,前面的字符都对应相等,则S<T
return -1;
else//串T比S短,前面的字符都对应相等,则S>T
return 1;
}
int StrLength(SString S)//返回S的元素个数,称为串的长度
{
return S[0];
}
Status Concat(SString &T,SString S1,SString S2)//用T返回有S1和S2联接而成的新串。若未截断,则返回TRUE,否则返回FALSE
{
int uncut,i;
if(S1[0]+S2[0]<=MAXSTRLEN)
{
for(i=1;i<=S1[0];i++)
T[i]=S1[i];
for(i=S1[0]+1;i<=S1[0]+S2[0];i++)
T[i]=S2[i-S1[0]];
T[0]=S1[0]+S2[0];
uncut=TRUE;
}
else if(S1[0]<MAXSTRLEN)
{
for(i=1;i<=S1[0];i++)
T[i]=S1[i];
for(i=S1[0]+1;i<=MAXSTRLEN;i++)
T[i]=S2[i-S1[0]];
T[0]=MAXSTRLEN;
uncut=FALSE;
}
else
{
for(i=1;i<=S1[0];i++)
T[i]=S1[i];
T[0]=MAXSTRLEN;
uncut=FALSE;
}
return uncut;
}
Status SubString(SString &Sub,SString S,int pos,int len)//用Sub返回串S的第pos个字符起长度为len的子串
{
int i;
if(pos<=S[0]&&len<=S[0]-pos+1)//len+pos-1<=S[0]时,才能够截取到长度为len的子串
{
for(i=1;i<=len;i++)
Sub[i]=S[pos+i-1];
Sub[0]=len;
return TRUE;
}
return FALSE;
}
int Index(SString S,SString T,int pos)//T为非空串,若主串S中第pos个字符之后(起)存在与T相等的子串,则返回第一个这样的子串在S中的位置,否则返回0
{
int i,m,n;
SString sub;
if(pos>0)
{
n=StrLength(S);
m=StrLength(T);
i=pos;
while(i<=n-m+1)
{
SubString(sub,S,i,m);
if(StrCompare(sub,T)!=0) ++i;
else return i;
}//while
}//if
return 0;
}//Index

void PrintStr(SString S)//输出串的值
{
int i;
for(i=1;i<=S[0];i++)
putchar(S[i]);
putchar('\n');
}
void PrintMenu()
{
printf("\n      串的基本操作     \n");
printf("-------------------------\n");
printf("*     1-串复制          *\n");
printf("*     2-串比较          *\n");
printf("*     3-求串的长度      *\n");
printf("*     4-串联接          *\n");
printf("*     5-求子串          *\n");
printf("*     6-子串在主串中位置*\n");
printf("*     0-退出            *\n");
printf("-------------------------\n");
printf("请选择菜单号(0-6):");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: