串(string)

串是有零个或者多个字符组成的有限序列。串是 限定了元素为字符的线性表。

串的存储结构

/*串的定长顺序存储结构定义*/
typedef struct
{   
    //maxSize为已经定义的常量,表示串的最大长度。
    //str数组长度定义为maxSize+1,是因为多出一个'\0'作为结束标记
    char str[maxSize];
    int length;
}Str;

/*串的变长分配存储表示(动态分配存储表示)结构体定义*/
typedef struct
{
    char *ch;  //指向动态分配存储区首地址的字符指针
    int length;  //串长度
}Str;

串的变长存储方式在使用时,需要用函数malloc()来分配一个长度为length、类型为char 型的连续存储空间,分配的空间可以用函数free()释放掉。用函数malloc()分配存储空间如果成功,则返回 一个指向起始地址的指针,作为串的基地址,这个地址由ch指针来指向;如果分配失败,则返回NULL。

串的基本操作

/*赋值操作*/
int strassign(Str& str,char* ch)
{
    if (str.ch)
        free(str.ch);  //释放原串空间
    int len=0;
    char *c=ch;
    while(*c)  //求ch串的长度
    {
        ++len;
        ++c;
    }
    if (len==0)  //如果ch为空串,则直接返回空串
    {
        str.ch=NULL;
        str.length=0;
        return 1;
    }
    else
    {
        str.ch=(char*)malloc(sizeof(char)*(len+1));
        //取len+1是为了多分配一个空间给'\0'字符
        if(str.ch==NULL)  //若分配空间失败则返回0
            return 0;
        else
        {
            c=ch;
            for (int i=0;i<=len;++i,++c)
            /*循环条件中使用<=是为将ch最后的'\0'复制到新串中作为结束标记*/
                str.ch[i]=*c;
            str.length=len;
            return 1;
        }
    }
}

/*函数strassign()使用时的格式如下*/
strassign(str,"cur input");

/*取串长度*/
int strlength(Str str)
{
    return str.length;
}

/*串比较*/
int strcompare(Str s1,Str s2)
{
    for (int i=0; i<s1.length && i<s2.length; i++)
        if(s1.ch[i]!=s2.ch[i])
            return s1.ch[i]-s2.ch[i];
    return s1.length-s2.length;
}

/*串连接*/
int concat(Str& str,Str str1,Str str2)
{
    if (str.ch)
    {
        free(str.ch);
        str.ch=NULL;
    }
    str.ch=(char*)malloc(sizeof(char)*(str1.length+str2.length+1))
    if (str.ch=NULL)
        return 0;
    int i=0;
    while(i<str1.length)
    {
        str.ch[i]=str1.ch[i];
        ++i;
    }
    int j=0;
    while(j<=str2.length)
    {
        str.ch[i+j]=str2.ch[j];
        ++j;
    }
    str.length=str1.length+str2.length;
    return 1;
}

/*求子串*/
int substring(Str& substr,Str str,int pos,int len)
{
    if(pos<0||pos>=length||length<0||len>str.length-pos)
        return 0;
    if(substr.ch)
    {
        free(substr.ch);
        substr.ch=NULL;
    }
    if (len==0)
    {
        substr.ch=NULL;
        substr.length=0;
        return 1;
    }
    else
    {
        substr.ch=(char*)malloc(sizeof(char)*(len+1));
        int i=pos;
        int j=0;
        while(i<pos+len)
        {
            substr.ch[j]=str.ch[i];
            ++i;
            ++j;
        }
        substr.ch[j]='\0';
        substr.length=len;
        return 1;
    }
}

/*串清空*/
int clearstring(Str& str)
{
    if(str.ch)
    {
        free(str.ch);
        str.ch=NULL;
    }
    str.length=0;
    return 1;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值