静态表示方法
#include<iostream> using namespace std; #define MAXSTRLEN 255 #define TRUE 1 #define FALSE 0 #define Status int typedef unsigned char String[MAXSTRLEN]; Status StrAssign(String &T,char *chars);//创建串 Status StrEmpty(String S);//判断串是否为空 Status StrCompare(String S,String T);//比较串 Status StrCopy(String &S,String T);//复制串 int StrLength(String S);//返回串的长度 Status Concat(String &T,String S1,String S2);//连接串 Status SubString(String &Sub,String S,int pos,int length);//替换串 int Index(String S,String T,int pos); Status Replace(String &S,String T,String V); Status StrInsert(String &S,int pos,String T); Status StrDelete(String &S,int pos,int length); void StrPrint(String S); void DestoryString(String &S); int main() { String S; //测试赋值函数 if(StrAssign(S,"abcd")) { printf("赋值成功 "); StrPrint(S); } //测试复制函数 char t[20]="I like coding"; String S1,T; StrAssign(T,t); if(StrCopy(S1,T)) { printf("复制成功! "); StrPrint(S1); } if(StrCompare(S,S1)) printf("S和S1相等 "); else printf("S和S1不相等 "); String temp=""; if(StrEmpty(temp)) printf("temp为空字符串 "); else printf("temp不为空 "); printf("s的长度为%d ",StrLength(S)); String S2; if(Concat(S2,S,S1)) { printf("连接成功 "); StrPrint(S2); } String s,V,ss; StrAssign(s,"bc"); int pos=Index(S,s,1); printf("%d ",pos); StrAssign(ss,"I am abcd haha ,you are a bitch"); StrAssign(V,"heor"); StrPrint(ss); if(Replace(ss,S,s)) { printf("替换成功!: "); StrPrint(ss); } //插入 StrInsert(ss,2,s); StrPrint(ss); StrDelete(ss,2,2); StrPrint(ss); return 0; } Status StrAssign(String &T,char *chars) { int m=strlen(chars); if(m>MAXSTRLEN)return FALSE; for(int i=0;i<m;i++) T[i+1]=chars[i]; T[0]=m; return TRUE; } Status StrEmpty(String S) { if(S[0]==0) return TRUE; return FALSE; } Status StrCompare(String S,String T) { int i=1; if(S[0]==T[0]) for(i=1;i<=S[0];i++) if(S[i]!=T[i]) break; int n=S[0]; if(i-1==n) return TRUE; return FALSE; } int StrLength(String S) { return S[0]; } Status StrCopy(String &S,String T) { S[0]=T[0]; for(int i=1;i<=S[0];i++) S[i]=T[i]; return TRUE; } Status Concat(String &T,String S1,String S2) { int uncut,i,j; if(S1[0]+S2[0]<=MAXSTRLEN)//如果没有截断 { T[0]=S1[0]+S2[0]; for(i=1;i<=S1[0];i++) T[i]=S1[i]; for(j=1;j<=S2[0];j++) T[j+i-1]=S2[j]; uncut=TRUE; } else if(S1[0]<MAXSTRLEN&&S1[0]+S2[0]>MAXSTRLEN)//部分截断 { T[0]=MAXSTRLEN; for(i=1;i<=S1[0];i++) T[i]=S1[i]; for(j=1;j+S1[0]<=MAXSTRLEN;j++) T[i++]=S2[j]; uncut=FALSE; } else if(S1[0]>=MAXSTRLEN) { int i; T[0]=MAXSTRLEN; for(i=1;i<=MAXSTRLEN;i++) T[i]=S1[i]; uncut=FALSE; } return uncut; } Status SubString(String &Sub,String S,int pos,int length) { int flag=0; int i; if(length>S[0]-pos+1)return FALSE; Sub[0]=length; for(i=1;i<=length;i++) Sub[i]=S[i+pos-1]; flag=1; return flag; } int Index(String S,String T,int pos) { int m,n,i; String sub; if(pos>0) { n=StrLength(S); m=StrLength(T); for(i=pos;i<=n-m+1;i++) { if(SubString(sub,S,i,m)) if(StrCompare(sub,T)) return i; } } return FALSE; } Status Replace(String &S,String T,String V) { int i,pos; if(S[0]<T[0]||S[0]<V[0])return FALSE; pos=Index(S,T,1); if(pos==0) { printf("替换错误! "); return FALSE; } else { if(T[0]==V[0]) for(i=pos;i<=V[0];i++) S[i]=V[i]; else if(T[0]<V[0]) { int length=V[0]-T[0]; for(i=S[0];i>=pos+length-1;i--) S[i+length]=S[i]; for(i=pos;i<=V[0];i++) S[i]=V[i]; } else if(T[0]>=V[0]) { int length = T[0]-V[0]; int n=StrLength(V); int m=StrLength(S); StrPrint(V); for(i=pos;i<=pos+n-1;i++) S[i]=V[i-pos+1]; for(;i<=m-length;i++) S[i]=S[i+length]; } } return TRUE; } Status StrInsert(String &S,int pos,String T) { int i,m,n; m=StrLength(T); n=StrLength(S); if(pos<=n) { for(i=n;i>=pos;i--) S[i+m]=S[i]; for(i=1;i<=m;i++) S[pos+i-1]=T[i]; } else { for(i=1;i<=m;i++) S[n+i]=T[i]; } return TRUE; } Status StrDelete(String &S,int pos,int length) { int m=StrLength(S); if(pos>m||length>m-pos+1)return FALSE; for(int i=pos;i<=m-length;i++) S[i]=S[i+length]; return TRUE; } void StrPrint(String S) { int n=S[0]; for(int i=1;i<=n;i++) printf("%c",S[i]); printf(" "); }
串实际上是一个字符数组,一般第一位适用于存储字符串的长度,注意char c=2;实际上是对应存储的ASCII码,使用的时候需要直接传换成int型,int a=c就解决了。
动态表示
#include<iostream> #include<cstring> using namespace std; #define OK 1 #define ERROR 0 #define SSIZE 100 #define Status int #define OVERFLOW 0 typedef struct{ char *ch;//若为空串,按长度分配 int length; }HString; void StrInit(HString &S); Status StrAssign(HString &T,char *chars); int StrLength(HString S); int StrCompare(HString S,HString T); Status ClearString(HString &S); Status Concat(HString &S,HString S1,HString S2); HString SubString(HString S,int pos,int length); void StrPrint(HString S); int main() { int n; char a[100]="abc",b[100]="bcd"; HString S,T,SS; StrInit(S); StrInit(T); StrInit(SS); StrAssign(S,a); StrAssign(T,b); n=StrCompare(S,T); if(n>0) printf("S>H "); else if(n==0) printf("S=H "); else printf("S<H "); //连接操作 if(Concat(SS,S,T)) StrPrint(SS); else printf("连接失败! "); HString V; V=SubString(SS,1,3); StrPrint(V); return 0; } void StrInit(HString &S) { S.ch=NULL; S.length=0; } Status StrAssign(HString &T,char *chars) { int n; n=strlen(chars); if(T.ch)free(T.ch); if(n==0) { T.ch=NULL; T.length=0; } else { T.ch=(char*)malloc(n*sizeof(char)); if(!T.ch)exit(ERROR); for(int i=0;i<n;i++) T.ch[i]=chars[i]; T.length=n; } return OK; } int StrLength(HString S) { return S.length; } int StrCompare(HString S,HString T) { // if(strcmp(S,T)>0) //这种方法不行,因为字符串结尾没有终结符,所以不能够比较 // return 1; // else if(strcmp(S,T)==0) // return 0; // else // return -1; for(int i=0;i<S.length&&i<T.length;i++) if(S.ch[i]!=T.ch[i]) return S.ch[i]-T.ch[i]; return S.length-T.length; } Status ClearString(HString &S) { if(S.ch) { free(S.ch); S.ch=NULL; } S.length=0; return OK; } Status Concat(HString &S,HString S1,HString S2) { int i; if(S.ch)free(S.ch); S.ch=(char*)malloc((S1.length+S2.length)*sizeof(char)); if(!S.ch)return ERROR;//申请内存失败; S.length=S1.length+S1.length; for(i=0;i<S1.length;i++) S.ch[i]=S1.ch[i]; for(i=0;i<S2.length;i++) S.ch[i+S1.length]=S2.ch[i]; return OK; } HString SubString(HString S,int pos,int length) { HString T; StrInit(T); T.ch=(char*)malloc(length*sizeof(char)); if(pos+length+1>S.length)exit(0); for(int i=pos;i<pos+length;i++) T.ch[i-pos]=S.ch[i]; T.length=length; return T; } void StrPrint(HString S) { for(int i=0;i<S.length;i++) printf("%c",S.ch[i]); printf(" "); }
版权声明:本文为博主原创文章,未经博主允许不得转载。