串的基本操作

来源:互联网 发布:ca证书网络检测未通过 编辑:程序博客网 时间:2024/05/29 18:14
#include <iostream>
#include <algorithm>
#include <cstring>
#define sqtrmax 1000
using namespace std;
typedef struct
{
    char *data;
    int length;
} sqtr;
void StrAssign (sqtr &S, char *chars);               //赋值
void Destroy(sqtr &S);                         //销毁
void StrCopy (sqtr &T,sqtr S);                  //复制
int StrLength(sqtr S);                            //长度
int StrEmpty (sqtr S);                               //判空
void Concat (sqtr &T,sqtr S1,sqtr S2);             //串联接
int StrCompare (sqtr S, sqtr T);                  //比较
int SubString (sqtr &Sub,sqtr S,int pos,int len);   //求子串
void ClearString (sqtr &S);                        //清空
int Index (sqtr S,sqtr T,int pos);                //定位函数
void Replace (sqtr &S, sqtr T,sqtr V);                  //串置换
int StrInsert (sqtr &S,int pos, sqtr T);              //插入
int StrDele (sqtr &S,int pos,int len);               //删除
void StrOutput(sqtr S) ;                              //输出
int main()
{
    char str[12]="abcssasdsss",str1[4]="sss",str2[4]="vvv";
    sqtr S,T,V,S1,Sub;
    S.data=NULL;
    T.data=NULL,V.data=NULL;
    StrAssign(S,str);
    StrAssign(T,str1);
    StrAssign(V,str2);
    cout<<"串S:";
    StrOutput(S);
    cout<<endl;
    cout<<"串T:";
    StrOutput(T);
    cout<<endl;
    cout<<"串V:";
    StrOutput(V);
    cout<<endl;
    cout<<"求第3个后S中与T相等的子串的位置";
    cout<<Index(S,T,3);
    cout<<endl;
    cout<<"求第3个后S中长度为3的子串";
    SubString(Sub,S,3,3);
    StrOutput(Sub);
    cout<<endl;
    cout<<"在串S的第10个字符之前插入串T:";
    StrInsert(S,10,T);
    StrOutput(S);
    cout<<endl;
    cout<<"删除串S从第2个字符起长度为3的子串:";
    StrDele(S,2,3);
    StrOutput(S);
    cout<<endl;
    cout<<"连接T,V到S1";
    Concat(S1,T,V);
    StrOutput(S1);
    cout<<endl;
    //cout<<"\n"<<"采用KMP算法进行模式匹配:";
    //cout<<Index_KMP(S,T,1)<<endl;
    cout<<"用串V替换S中与T相等的所有子串:";
    Replace(S,T,V);
    StrOutput(S);
    cout<<endl;






}
/**赋值**//*strcpy(S.data,chars);*/
void StrAssign (sqtr &S, char *chars)
{
    int i;
    S.data=(char *)malloc(sqtrmax *sizeof(char));
    if(!S.data) exit(0);
    for(i=0; chars[i]!='\0'; i++)
        S.data[i]=chars[i];
        S.data[i]='\0';
    S.length=i;
}
/**长度**//*strlen(S.data);*/
int StrLength(sqtr S)
{
    return S.length;
}
/**判空**/
int StrEmpty (sqtr S)
{
    if(!S.length)  //长度=0
        return 1;
    else
        return 0;
}
/**复制**//*strcpy(S.data,chars);*/
void StrCopy (sqtr &T,sqtr S)
{
    StrAssign(T,S.data);//不是S
}




/**清空**/
void ClearString (sqtr &S)
{
    if(S.data)
    {
        delete S.data;
        S.data=NULL;
    }
    S.length=0;
}
/**销毁 似清空**/
void Destroy(sqtr &S)
{
    if(S.data)
    {
        delete S.data;
        S.data=NULL;
    }
}
/**比较**//*(strcmp(S.data,T.data)==0)*/
int StrCompare (sqtr S, sqtr T)
{
    int i;
    for(i=0; i<S.length&&i<T.length; i++)
        if(S.data[i]!=T.data[i])
            return S.data[i]-T.data[i];//S的值大就>0
    return S.length-T.length;
    //注意return有终止作用,谁先执行就return谁;
}
/**删除**/
int StrDele (sqtr &S,int pos,int len)
{
    if(pos<1||pos>S.length-len+1)
        return 0;
    int i=0;
    while(i<pos-1)
        i++;
    for(i=pos-1; i<S.length-len; i++)
        S.data[i]=S.data[i+len];
    S.data[i]='\0';
    S.length-=len;


}
/**串联接**/
void Concat (sqtr &T,sqtr S1,sqtr S2)
{
    T.length=S1.length+S2.length+1;
    T.data=(char *)malloc(S1.length+S2.length *sizeof(char));
    int j=0,k=0;
    while(S1.data[j]!='\0') T.data[k++]=S1.data[j++];
    j=0;
    while(S2.data[j]!='\0') T.data[k++]=S2.data[j++];
    T.data[k]='\0';
}
/**求子串**/
int SubString (sqtr &Sub,sqtr S,int pos,int len)
{
    // 以 Sub 返回串 S 中第 pos 个字符起长度为 len 的子串
    Sub.data=(char *)malloc(len *sizeof(char));
    Sub.length=len;
    int i,k;
    if(pos<1)
        return 0;
    i=0;
    while(i<pos-1&&S.data[i]!='\0') i++;
    if(i<pos-1||S.data[i]=='\0')
        return 0;
    else
    {
        k=0;
        while(len--&&S.data[i]!='\0')
        {
            Sub.data[k++]=S.data[i++];
            //cout<<Sub.data[k-1]<<endl;
        }
        if(k<S.length) return 0;
        else
            Sub.data[k]='\0';


    }
}
/**定位函数**/
int Index (sqtr S,sqtr T,int pos)
{
    //若主串 S 中存在和串 T 值相同的子串,则返回它在主串 S 中第 pos个字符之后第一次出现的位置; 否则函数值为0。
    int i,j;
    if(pos>0)
    {
        i=pos-1;
        j=0;
        while(S.data[i+j]!='\0'&&T.data[j]!='\0')
        {
            if(S.data[i+j]==T.data[j])
            {
                j++;
            }
            else
            {
                i++;//相当于二重for循环中跳出j,进入i循环
                j=0;
            }
        }
        if(T.data[j]=='\0')
                return i+1;
            else
            return 0;
    }
}
/**串置换**///用 V 替换主串 S 中出现的所有与模式串)T 相等的不重叠的子串。
void Replace (sqtr &S,sqtr T,sqtr V)
{
    sqtr news,sub;
    news.data=(char *)malloc(sqtrmax *sizeof(char));
    news.data=NULL;
    int n=S.length,m=T.length;
    int i=1,pos=1,j=0;
    while(pos<=n-m+1&&i)//n-m+1
    {
        i=Index(S,T,pos);
        if(i!=0)//不能写i,因为i是位置,不一定啥数
        {
            SubString(sub,S,pos,i-pos);
            if(j==0)
            {
            Concat(news,sub,V);
            }
            else
            {
                if(i-pos!=0)
                Concat(news,news,sub);
                Concat(news,news,V);//当非第一次时,后面要直接连在news上
            }
            pos=i+m;
            j++;
        }


    }
    SubString(sub,S,pos,n-pos+1);
    if(n-pos+1!=0)
    Concat(S,news,sub);
    StrAssign(S,news.data);
}
/**插入**/
int StrInsert (sqtr &S,int pos,sqtr T)
{
    int sl=S.length,tl=T.length;// 在串 S 的第 pos(1≤pos≤StrLength(S)+1) 个字符之前插入串T
    char S1[sl+1] ;            // 设S1为辅助串空间
    if (pos < 1 || pos > sl+1)
        return 0;               // 插入位置不合法;
    if (tl>0)
    {
        int i=0,k,j;
        while ( S.data[i]!='\0')
        {
            S1[i]=S.data[i];
            i++;// 暂存串S
        }
        S1[i]='\0';
        S.data= (char *)malloc((sl + tl +1) *sizeof(char));   // 重新分配空间
        for ( i=0, k=0; i<pos-1; i++)
        {
            S.data[k++] = S1[i];
            // 保留插入位置之前的子串
        }
        j = 0;
        while ( T.data[j]!= '\0')
        {
            S.data[k++] = T.data[j++];
        }     // 插入T
        while ( S1[i] != '\0')
            S.data[k++] = S1[i++];  // 复制插入位置之后的子串
        S.data[k] = '\0';
        S.length=k;                      // 置串S的结束标志
    }
}
/**输出**/
void StrOutput(sqtr S)
{
    int i=0;
    while(i<S.length)
    {
        cout<<S.data[i];
        i++;
    }
}V
0 0