字符串的基本操作【静态数组/顺序存储】

#include<iostream>
#include<bits/stdc++.h>
using namespace std;

#define maxsize 110//最大串长
typedef struct
{
    char data[maxsize];//每个分量存一个字符
    int length=0;//串的实际长度
}SqString;//从data【0】开始存储,不包含'\0'


//清空串 逻辑上清空
bool ClearString(SqString &T)
{
    T.length=0;
    return true;
}


//判断串是否为空,为空则返回True
bool StrEmpty(SqString T)
{
    return T.length;
}


//把chars赋值给T    【创】
bool StrAssign(SqString &T,char chars[])
{
    ClearString(T);//防止有数据残留,导致最后计算的长度出错
    for(int i=0;chars[i]!='\0';i++)//将chars中的字符一个一个赋值给T
    {
        if(T.length>=maxsize){ClearString(T); return false;}// chars超出了T的最大存储长度
        T.data[i]=chars[i];
        T.length++;
    }
    return true;
}



//把串T中的字符复制到串S中
bool StrCopy(SqString &S,SqString T)
{
    ClearString(S);//去除脏数据
    for(int i=0;i<T.length;i++)
    {
        S.data[i]=T.data[i];
        S.length++;
    }
    return true;
}

//比较两个字符串的长度
int StrCompare(SqString S,SqString T)//S>T 返回>0 ,S=T 返回0,   S<T返回<0
{
    for(int i=0;i<T.length&&i<S.length;i++)
    {
        if(S.data[i]!=T.data[i]) return S.data[i]-T.data[i];
    }
    return S.length-T.length;//此时说明有一个字符串是另一个字符串的前缀,所以直接判断长度
}

//求子串
bool SubString(SqString &Sub,SqString T,int pos,int len)//求子串[第几个字符]并返回到Sub中
{
    if(pos-1+len-1>T.length-1) {ClearString(Sub); return false;}//子串输入错误,超出T
    for(int i=0;i<len;i++)//T.data[0]也存放字符,因此POS-1
    {
        Sub.data[i]=T.data[pos-1+i];
    }
    Sub.length=len;
    return true;
}

//串联接 用T返回由S1和S2 联结的串
bool Concat(SqString &T,SqString S1,SqString S2)
{
    StrEmpty(T);//去除脏数据
    if(maxsize<S1.length+S2.length) return false;
    for(int i=0,j=0;i<S1.length+S2.length;i++)//分别用i,j标记S1,S2
    {
        if(i<S1.length)
            T.data[i]=S1.data[i];
        else
            T.data[i]=S2.data[j++];
    }
    T.length=S1.length+S2.length;
    return true;
}


//定位操作,返回字符串S在T中第一次出现的位置[第几个字符],若不存在,则返回-1
int Index(SqString S,SqString  T)
{
    for(int i=0;i<T.length;i++)//从第一个位置开始判断
    {
        SqString sub;
        if(SubString(sub,T,i+1,S.length))//取出长度为S.length的字符串存入sub中
        {
            if(StrCompare(sub,S)==0)//两个字符串相等
                return i+1;
        }
    }
    return -1;
}

bool StrDisplay(SqString T)//输出字符到屏幕中
{
    for(int i=0;i<T.length;i++)
    {
        cout<<T.data[i]<<" ";
    }
    cout<<endl;
    return true;
}

int main()
{
    SqString T,S,W,L;
    char c[]="sadsdc",d[]="sadsdcz";
    StrAssign(T,c);
    //StrDisplay(T);
    StrCopy(S,T);
    //StrDisplay(S);

    //比较长度
    StrAssign(T,c);
    StrAssign(S,d);
    //cout<<StrCompare(T,S);

    //求子串
    if(SubString(S,T,6,5))//测试数据 [6 1][ 6 2] [2 5] [2 6]
        StrDisplay(S);
    else
        cout<<"你个zz"<<endl;

    //串联结
    char e[]="i love ",f[]="mon and my sisters !";
    StrAssign(T,e);
    StrAssign(S,f);
    Concat(W,T,S);
    StrDisplay(W);
    StrDisplay(S);

    //定位操作
    cout<<Index(S,W);
    cout<<Index(T,W);





}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值