串的基本操作
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):"); }
相关文章推荐
- 主元素(LintCode)
- noip2013 表达式求值 (表达式求值加法与乘法)
- Android 调用摄像头拍照 以及 从相册中选择照片
- iOS9之后 xcode网络数据请求设置
- 大道至简-第五章-心得体会
- Spark学习笔记--stage和task的划分
- Myeclipse应用------常用快捷键
- new和delete的使用规范
- noip2013 计数问题 (模拟)
- 如何使用Python3读写INI配置文件
- 简单Dream-登录em报错密码已经过期--实测已解决
- 数据库表横表变纵表
- oracle bitmap join index
- new和delete的使用规范
- UIApplicationLaunchOptionsRemoteNotificationKey
- 2014中国大数据技术大会33位核心专家演讲PDF下载
- Android中十六进制颜色的基本使用
- [Python]python环境配置
- 51.VC(Custom)-__super简介
- Jmeter中Websocket协议支持包的使用