C语言 串的实现练习

#include <stdio.h>
#include <stdlib.h>

//自定义
#define MAXLEN 255 //预定义的最大串长
#define true 1
#define false 0
#define bool char
//串的顺序存储结构
typedef struct
{
    char ch[MAXLEN + 1];
    int length;
}SString;

//串的初始化
bool StrInit(SString* Str)
{
    Str->length = 0;
    return true;
}

//求串长
int StrLength(SString Str)
{
    return Str.length;
}

//清空
bool StrClear(SString* Str)
{
    Str->length = 0;
    return true;
}

//判空
bool StrEmpty(SString Str)
{
    return !Str.length;
}

//赋值,把字符串ch的内容赋值给T
bool StrAssign(SString* T, char* ch)
{
    //如果T没空间那判错
    if(!T)
    {
        printf("StrAssign:T is NULL!\n");
        return false;
    }
    //把输入的字符串依次输入进串里
    int i = 1;
    for(i = 1; ch[i-1] != '\0'; i++)
    {
        if(i <= MAXLEN)
        {
            T->ch[i] = ch[i-1];
        }
        else break;
    }
    //字符串的长度+1
    T->length = i-1;
    return true;
}

//输出存储字符串
bool StrPrint(SString Str)
{
    //如果是空的或错的就不用输出了
    if(StrEmpty(Str))
    {
        printf("StrPrint:The SString is an empty sstring or an error sstring\n");
        return false;
    }
    //把串中每个字符依次输出
    for(int i = 1; i <= Str.length; i++)
    {
        printf("%c",Str.ch[i]);
    }
    printf("\nLength = %d\n\n", StrLength(Str));
    return true;

}

//复制操作,把S复制给T
bool StrCopy(SString* T, SString S)
{
    //先判空
    if(StrEmpty(S))
    {
        printf("StrCopy:The copied SString is an empty SString\n");
        return false;
    }
    //把一个串中的元素依次赋值给第二个串
    for(int i = 1; i < S.length; i++)
    {
        T->ch[i] = S.ch[i];
    }
    //长度直接设为被复制串的长度
    T->length = S.length;
    return true;
}

//串联接,把S1和S2连接后输出在T中
bool StrConCat(SString* T, SString S1, SString S2)
{
    //都是空的时候就不用链接了
    if(StrEmpty(S1) || StrEmpty(S2))
    {
        printf("StrConcat:At least one fo the two sstring is an empty sstring\n");
        return false;
    }
    //把第一个的值复制进T
    StrCopy(T, S1);
    //从第一个串长度的数开始i,依次向后遍历,到两个串加起来的长度,并且长度不能超过最大长度
    for(int i = T->length + 1; i <=(StrLength(S1)+StrLength(S2)) && i < MAXLEN; i++)
    {
        T->ch[i] = S2.ch[i - StrLength(S1)];
    }
    //串长
    T->length = S1.length+S2.length;
    return true;
}

//求子串,sub是要求的字串, S为原串,pos为字串开始的位置,len为字串的长度
bool SubString(SString* Sub, SString S, int pos, int len)
{
    //如果子串位置和长超过了界限,判错
    if((pos+len-1) > StrLength(S))
    {
        printf("SubString:The substring does not exist\n");
        return false;
    }
    for(int i = pos; i <= pos+len-1; i++)
    {
        Sub->ch[i-pos+1] = S.ch[i];
    }
    Sub->length = len;
    return true;
}

//串比较
int StrCompare(SString Str1, SString Str2)
{
    for(int i = 1; i <= StrLength(Str1) && i <= StrLength(Str2); i++)
    {
        if(Str1.ch[i] != Str2.ch[i])
            //返回值小于零还是大于零决定哪个字符串大
            return Str1.ch[i] - Str2.ch[i];
    }
    //如果没比较出谁最大谁小的话, 就看哪个字符串长
    return StrLength(Str1) - StrLength(Str2);
}

//顺序存储字符串的定位操作, S是主串,T是要搜索的字串,找到就返回位置
int StrIndex(SString S, SString T)
{
    if(StrEmpty(S))
        return false;
    int i = 1;
    //临时存储子串
    SString sub;
    //遍历对比
    while(i <= StrLength(S)-StrLength(T)+1)
    {
        //调用子串函数,把调出的字串传给sub
        SubString(&sub, S, i, StrLength(T));
        //如果对比的结果是0说明相等,S中有子串T
        if(StrCompare(sub, T) != 0) i++;
        else return i;
    }
    //到最后也没找到,返回-1
    return -1;
}





int main()
{
    //初始化
    SString str1, str2, str3;
    StrInit(&str1);
    StrInit(&str2);
    StrInit(&str3);
    //测试赋值
    StrAssign(&str1,"Str1:ABC");
    StrAssign(&str2,"HUAWEI matepad pro!!");
    StrAssign(&str3,"Str3:IPhone 13 Pro Plus 666!");
    //测试复制
    StrCopy(&str1, str2);

    //测试输出
    StrPrint(str1);
    StrPrint(str2);
    StrPrint(str3);

    //若对您有帮助请点个赞哦~

    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

百年bd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值