首页 > 代码库 > 串最基本的5个操作的C实现
串最基本的5个操作的C实现
1. 串赋值StrAssign
/* 生成一个其值等于chars的串T */雅加达娱乐城Status StrAssign(String T,char *chars){ int i; if(strlen(chars)>MAXSIZE) return ERROR; else { T[0]=strlen(chars); for(i=1;i<=T[0];i++) T[i]=*(chars+i-1); return OK; }}
- 串赋值的算法比较简单,把目标字符串一个个复制到数组T即可。T[i]=*(chars+i-1) 这行代码是关键,字符串可以用指针访问。
2. 串比较StrCompare
/* 初始条件: 串S和T存在 *//* 操作结果: 若S>T,则返回值>0;若S=T,则返回值=0;若S < T,则返回值 < 0 */int StrCompare(String S,String T){ int i; for(i=1; i<=S[0]&&i<=T[0]; ++i) if(S[i]!=T[i]) return S[i]-T[i]; return S[0]-T[0];}
- 这里字符串数组的第一个元素存储的是字符串的长度,所以循环条件是 i<=S[0]&&i<=T[0]。假如 S[i]与T[i]不相等,就返回它们的差值,根据这个差值我们就可以知道,哪个字符串比较大。
3. 求串长 StrLength
/* 返回串的元素个数 */int StrLength(String S){ return S[0];}
- 字符串数组的第一个元素存储的就是它的长度,所以直接返回第一个元素就可以了。
4. 串联接Concat
/* 用T返回S1和S2联接而成的新串。若未截断,则返回TRUE,否则FALSE */Status Concat(String T,String S1,String S2){ int i; if(S1[0]+S2[0]<=MAXSIZE) { /* 未截断 */ for(i=1;i<=S1[0];i++) T[i]=S1[i]; for(i=1;i<=S2[0];i++) T[S1[0]+i]=S2[i]; T[0]=S1[0]+S2[0]; return TRUE; } else { /* 截断S2 */ for(i=1;i<=S1[0];i++) T[i]=S1[i]; for(i=1;i<=MAXSIZE-S1[0];i++) T[S1[0]+i]=S2[i]; T[0]=MAXSIZE; return FALSE; }}
连接两个串,需要考虑截断问题,判断条件就是 S1[0]+S2[0] 是否大于 MAXSIZE。
如果未发生截断,则将数组S2的元素补到S1的后边 T[S1[0]+i]=S2[i];
如果发生截断,那就将MAXSIZE-S1[0]个S2的元素补到S1的后边。
5. 求子串SubString
/* 用Sub返回串S的第pos个字符起长度为len的子串。 */Status SubString(String Sub,String S,int pos,int len){ int i; if(pos<1||pos>S[0]||len<0||len>S[0]-pos+1) return ERROR; for(i=1;i<=len;i++) Sub[i]=S[pos+i-1]; Sub[0]=len; return OK;}
- 这里需要注意条件,起始位置不能小于1,也不能大于串长度,长度len不能小于0,也不能大于总长度减去起始位置等。接下来就简单了,从起始位置开始,将串数组元素逐个赋值给sub数组。
完整的可执行程序为:
#include "stdio.h"#include "string.h"#include "stdlib.h"#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define MAXSIZE 40 /* 存储空间初始分配量 */typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */typedef char String[MAXSIZE+1]; /* 0号单元存放串的长度 *//* 输出字符串T */void StrPrint(String T){ int i; for(i=1;i<=T[0];i++) printf("%c",T[i]); printf("\n");}/* 生成一个其值等于chars的串T */Status StrAssign(String T,char *chars){ int i; if(strlen(chars)>MAXSIZE) return ERROR; else { T[0]=strlen(chars); for(i=1;i<=T[0];i++) T[i]=*(chars+i-1); return OK; }}/* 返回串的元素个数 */int StrLength(String S){ return S[0];}/* 初始条件: 串S和T存在 *//* 操作结果: 若S>T,则返回值>0;若S=T,则返回值=0;若S < T,则返回值< 0 */int StrCompare(String S,String T){ int i; for(i=1;i < =S[0]&&i<=T[0];++i) if(S[i]!=T[i]) return S[i]-T[i]; return S[0]-T[0];}/* 用T返回S1和S2联接而成的新串。若未截断,则返回TRUE,否则FALSE */Status Concat(String T,String S1,String S2){ int i; if(S1[0]+S2[0]<=MAXSIZE) { /* 未截断 */ for(i=1;i<=S1[0];i++) T[i]=S1[i]; for(i=1;i<=S2[0];i++) T[S1[0]+i]=S2[i]; T[0]=S1[0]+S2[0]; return TRUE; } else { /* 截断S2 */ for(i=1;i<=S1[0];i++) T[i]=S1[i]; for(i=1;i<=MAXSIZE-S1[0];i++) T[S1[0]+i]=S2[i]; T[0]=MAXSIZE; return FALSE; }}/* 用Sub返回串S的第pos个字符起长度为len的子串。 */Status SubString(String Sub,String S,int pos,int len){ int i; if(pos < 1||pos>S[0]||len < 0||len>S[0]-pos+1) return ERROR; for(i=1;i<=len;i++) Sub[i]=S[pos+i-1]; Sub[0]=len; return OK;}int main(){ int i, j, opp; char s; String t,s1,s2,sub; Status k; printf("\n1.StrAssign 生成串 \n2.StrLength 求串长 \n3.StrCompare 串比较 "); printf("\n4.Concat 串连接 \n5.SubString 求子串"); printf("\n0.退出 \n请选择你的操作:\n"); while(opp != ‘0‘) { scanf("%d",&opp); switch(opp) { case 1: k=StrAssign(s1,"nowamagic.net"); if(!k) { printf("串长超过MAXSIZE(=%d)\n",MAXSIZE); exit(0); } printf("串s1为:"); StrPrint(s1); printf("\n"); break; case 2: printf("串s1长为%d \n",StrLength(s1)); break; case 3: k=StrAssign(s2,"google.com"); if(!k) { printf("串长超过MAXSIZE(%d)\n",MAXSIZE); exit(0); } printf("串s2为:"); StrPrint(s2); printf("\n"); i=StrCompare(s1,s2); if(i < 0) s=‘ < ‘; else if(i==0) s=‘=‘; else s=‘>‘; printf("串s1%c串s2\n",s); break; case 4: Concat(t,s1,s2); StrPrint(t); break; case 5: printf("求串s1的子串,请输入子串的起始位置: "); scanf("%d", &i); printf("请输入子串的长度: "); scanf("%d", &j); printf("起始位置:%d,子串长度:%d\n", i, j); k=SubString(sub,s1,i,j); if(k) { printf("子串sub为: "); StrPrint(sub); } break; case 0: exit(0); } }}
串最基本的5个操作的C实现
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。