学习记录,仅供参考,希望可以指出错误

实际上就是存入数组对数组操作

 

#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);
}