学习记录,仅供参考,希望可以指出错误
实际上就是存入数组对数组操作
#include<stdio.h> #include<stdlib.h> #include<string> #define MAXSTRLEN 255 //串长最大255 typedef unsigned char SString[MAXSTRLEN+1];//0号单元存放串的长度 //个人在位于最后的位置加上‘\0'这样就这直接作为串%s输出了,所以应该+2 //StrAssign(&T,chars)创建串T //StrCopy(&T,S)拷贝 //StrEmpty(S)判空 //StrCompare(S,T) S>T返回值>0 //Strlen(S) //ClearString(&S) //Concat(&T,S1,S2)T由S1和S2连接 ----------------教材 //SubString(&Sub,S,pos,len)用Sub返回串S的第pos个字符起长度为len的字串 //Index(S,T,pos)若S中存在和T值相同的字串,则返回它在主串S中第pos个字符之后第一次出现的位置,否则函数值为0 //Replace(&S,T,V)用V替换主串S中出现的所有与T相等的不重叠的子串 //StrInsert(&S,pos,T)在串S的第pos个字符后插入T //StrDelete(&S,pos,len)删除第pos个字符起长度为len的子串 //DestoryString(&S) int Strlen(SString S){ return S[0]; } int StrAssign(SString s,char *chars){ if(strlen(chars)>MAXSTRLEN) return 0; s[0]=strlen(chars); int i=0; for(;i<Strlen(s);i++){ s[i+1]=chars[i]; } s[i+1]='\0';//这样可以直接%s输出 return 1; } void StrCopy(SString &T,SString S){ for(int i=0;i<=Strlen(S);i++) T[i]=S[i]; T[Strlen(S)+1]='\0'; } int StrEmpty(SString S){ if(Strlen(S)==0)return 1; else return 0; } int StrCompare(SString S,SString T){ if(Strlen(S)>Strlen(T))return 1; else if(Strlen(S)<Strlen(T)) return -1; for(int i=1;i<=Strlen(S);i++){ if(S[i]>T[i]) return 1; else if(S[i]<T[i]) return -1; } return 0; } int ClearString(SString &S){ S[0]=0; return StrEmpty(S); } int Concat(SString &T,SString S1,SString S2){ //if(Strlen(S1)+Strlen(S2)>MAXSTRLEN)return 0;//不做截断处理 StrCopy(T,S1); int len=Strlen(T),sumlen=len+Strlen(S2); if(sumlen>MAXSTRLEN) sumlen=MAXSTRLEN;//截断 //for(int i=1;i<=Strlen(S2);i++) for(int i=1;len+i<=sumlen;i++) T[len+i]=S2[i]; T[0]=len+Strlen(S2); T[Strlen(T)+1]='\0'; //StrCopy(T+T[0],S2); return 1; } int SubString(SString &Sub,SString S,int pos,int len){ if(pos<1||pos>Strlen(S)||len<0||len>Strlen(S)-pos+1) return 0; Sub[0]=len; for(int i=0;i<len;i++){ Sub[i+1]=S[pos+i]; } Sub[len+1]='\0'; return 1; } int Index(SString S,SString T,int pos){ //-----省略对参数判断 for(int yn=0;pos+Strlen(T)<=Strlen(S)+1;pos++,yn=0){ for(int test=pos,i=1;i<=Strlen(T);test++,i++){ if(S[test]!=T[i]) yn=1; } if(yn==0) return pos; } return 0; } int Replace(SString &S,SString T,SString V){ for(int k=1;;){ int pos=Index(S,T,k); k=pos; //i=pos;//记录下来此时j值 if(pos!=0){ if(Strlen(V)<=Strlen(T)){//如果新的长度小于等于旧的 int chalen=Strlen(T)-Strlen(V); for(int i=pos;i+chalen<=Strlen(S);i++){//前插步777 S[i]=S[i+chalen]; } S[0]=Strlen(S)-chalen; }else{//如果新的长度大于等于旧的 int slen=Strlen(S),tlen=Strlen(T),vlen=Strlen(V); int len=slen+vlen-tlen; if(len>MAXSTRLEN) return 0;//超出了最大存储量 for(int i=len;i>pos;slen--,i--){//后撤步777 S[i]=S[slen]; } S[0]=len; } for(int j=1;j<=Strlen(V);j++,pos++){//插入 S[pos]=V[j]; } S[Strlen(S)+1]='\0'; } else if(pos==0) break; } return 1; } int StrInsert(SString &S,int pos,SString T){//插入是从pos的下一个开始 //-----省略对参数判断 //if(Strlen(S)+Strlen(T)>MAXSTRLEN) return 0; int slen=Strlen(S),tlen=Strlen(T),sumlen=slen+tlen; for(int i=tlen+slen,j=slen;i>pos;j--,i--){//后撤步777 S[i]=S[j]; } if(sumlen>MAXSTRLEN) sumlen=MAXSTRLEN; for(int i=1;slen+i<=sumlen;i++){//插入 S[pos+i]=T[i]; } S[0]=Strlen(S)+Strlen(T); S[Strlen(S)+1]='\0'; return 1; } int StrDelete(SString &S,int pos,int len){ int Slen=Strlen(S); if(pos<=0||pos>=Slen||Slen-len<0) return 0; S[0]=Slen-len; for(int i=0;i<Slen-len;i++){ S[pos+i]=S[pos+i+len]; } S[Strlen(S)+1]='\0'; return 1; } int Replace2(SString &S,SString T,SString V){ for(int k=1;;){ int pos=Index(S,T,k); k=pos; if(pos!=0){ StrDelete(S,pos,Strlen(T)); StrInsert(S,pos-1,V); }else if(pos==0) break; } return 0; } void DestoryString(SString &S){//?不会 free(S); } //算法4.1 int Index_4_1(SString S,SString T,int pos){ //T为非空串。若主串S中第pos个字符之后存在与T相等的子串, //则返回第一个这样的子串在S中的位置,否则返回0 if(pos>0){ int n=Strlen(S),m=Strlen(T),i=pos; while(i<=n-m+1){//当前位置要小于等于 字符串长度减去子字符串长度,再+1 SString sub; SubString(sub,S,i,m);//i最开始等于给定的pos,从i开始找长度为m的字符串,然后与T对比,若一样就返回i int j=StrCompare(sub,T); if(j!=0) ++i;//判断是否找到了 else return i; } } return 0; } //算法4.2 int Concat_4_2(SString &T,SString S1,SString S2){ //由T返回由S1和S2连接而成的新串,若未截断,则返回TRUE if(S1[0]+S2[0]<=MAXSTRLEN){ for(int i=0;i<=Strlen(S1);i++){ T[i]=S1[i]; } for(int i=1;i<=Strlen(S2);i++){ T[Strlen(T)+i]=S2[i]; } T[0]=Strlen(T)+Strlen(S2); return 1; }else if(S1[0]<MAXSTRLEN){//截断----啥意思,长度不就应该是小于MAXSTRLEN吗,难不成还专门区分+1+2? for(int i=0;i<=Strlen(S1);i++){ T[i]=S1[i]; } for(int i=1;i<=MAXSTRLEN-Strlen(S2);i++){ T[Strlen(T)+i]=S2[i]; } T[0]=Strlen(T)+Strlen(S2); return 0; }else{//有大病 for(int i=0;i<=MAXSTRLEN;i++){ T[i]=S1[i]; } return 0; } } //算法4.3 int SubString_4_3(SString &Sub,SString S,int pos,int len){ //用Sub返回串S的第pos个字符起长度为len的子串 //1<=pos<=Strlen(S) 且 0<=len<Strlen(S)-pos+1---------------人话就是截取位置不超S,截取长度的不要超过S if(pos<1||pos>Strlen(S)||len<0||len>Strlen(S)-pos+1)return 0; for(int i=1;i<=len;i++) Sub[i]=S[pos+i-1]; Sub[0]=len; return 1; } void main(){ char* c1="1231231abc1231456123"; char* c2="1231"; SString s1,s2; printf("\n\n测试 StrAssign--------------------------------------\n\n"); StrAssign(s1,c1); StrAssign(s2,c2); printf("s1:%s \ns2:%s",s1+1,s2+1); SString s3; printf("\n\n测试 StrCopy--------------------------------------\n\n"); StrCopy(s3,s1); printf("s3:%s\n",s3+1); printf("\n\n测试 Concat-------------------------------------\n\n"); SString s6; Concat(s6,s1,s2); s6[Strlen(s6)+1]='\0'; printf("s6len:%d s6:%s\n\n",Strlen(s6),s6+1); printf("\n\n测试 Strlen--------------------------------------\n\n"); printf("s3-len:%d\n",Strlen(s3)); printf("\n\n测试 StrCompare--------------------------------------\n\n"); printf("StrCompare(s1,s2):%d\n",StrCompare(s1,s2)); printf("\n\n测试 ClearString--------------------------------------\n\n"); printf("s3清除前长度:%d,输出:%s\n",Strlen(s3)); ClearString(s3); printf("s3清除后长度:%d,输出:%s\n",Strlen(s3),s3+1); printf("\n\n测试 SubString从s1的第3位起传3个--------------------------------------\n\n"); SubString(s3,s1,3,3); printf("s3:%s\n",s3+1); printf("\n\n测试 Index从1开始--------------------------------------\n\n"); printf("Index(S1,S2,1):%d\n",Index(s1,s2,1)); printf("\n\n测试 Index从3开始--------------------------------------\n\n"); printf("Index(S1,S2,3):%d\n",Index(s1,s2,3)); printf("\n\n测试 Replace2-------------------------------------\n\n"); SString s4;StrAssign(s4,"QGNNNNNNNNNBBBBBBBBBB"); printf("s1:%s\n",s1+1); printf("s4:%s\n",s4+1); printf("s2:%s\n",s2+1); Replace2(s1,s2,s4); printf("s1:%s\n\n",s1+1); printf("\n\n测试 StrInsert-------------------------------------\n\n"); printf("s4:%s s2:%s\n",s4+1,s2+1); StrInsert(s4,2,s2); printf("s4+s2:%s\n",s4+1); printf("\n\n测试 StrDelete-------------------------------------\n\n"); printf("s1:%s\n",s1+1); StrDelete(s1,5,5); printf("s1的第5个开始减5个:%s\n",s1+1); printf("s1:%s\n",s1+1); //--------------------------------------------------------------------------------- printf("\n\n测试 算法4.1-Index-------------------------------------\n\n"); SString s5;StrAssign(s5,"NB"); printf("s1:%s\ns5:%s\ns1首次出现s5位置:%d\n",s1+1,s5+1,Index_4_1(s1,s5,1)); printf("s1len:%d s5len:%d\n",Strlen(s1),Strlen(s5)); printf("\n\n测试 算法4.2-Concat-------------------------------------\n\n"); SString s7; Concat_4_2(s7,s1,s2); s7[Strlen(s7)+1]='\0'; printf("s7len:%d s7:%s\n\n",Strlen(s7),s7+1); SString s8; printf("\n\n测试 算法4.3-SubString从s1的第3位起传3个--------------------------------------\n\n"); SubString(s8,s1,3,3); printf("s1:%s\n",s1+1); printf("s8:%s\n",s8+1); }