基本操作 - wolai 笔记

1.串的基本操作

1.1定义

typedef struct
{
    char* ch = NULL;       
    int length = 0;     // 长度
}HString;

1.2生成串

// 生成一个串常量chars的串T
bool StrAssign(HString& T, char* chars)
{
    int i = 0;
    // 求char*字符串长度
    for(i = 0; *(chars + i) != '\0'; i++);
    // printf("%d\n", i);
    if(T.ch != NULL)        // 释放源字符串
        free(T.ch); 
    if(i == 0)
    {
        T.ch = NULL;
        T.length = 0;
    }
    else
    {
        if(!(T.ch = (char*)malloc(i * sizeof(char))))
            return false;
        for(int j = 0; j < i; j++)
            *(T.ch + j) = *(chars + j); // 字符串复制
        T.length = i;
    }
    return true;
}

1.3串的长度

// 串的长度
int StrLength(HString S)
{
    return S.length;
}

1.4比较函数

// 比较函数
// S > T,返回值大于0;S = T,返回值等于0;S < T,返回值小于0
int StrCompare(HString S, HString T)
{
    int i;
    for(i = 0; i < S.length && i < T.length; i++)
    {
        if(S.ch[i] != T.ch[i])
            return S.ch[i] - T.ch[i];
    }
    return S.length - T.length;
}

1.5清空字符串

// 清空
int StrClear(HString& S)
{
    if(S.ch)
    {
        free(S.ch);
        S.ch = NULL;
    }
    S.length = 0;
    return 0;
}

1.6合并字符串

// T返回S1和S2连接而成的串
int Concat(HString& T, HString S1, HString S2)
{
    if(T.ch)
        free(T.ch);
    T.length = S1.length + S2.length;

    if(!(T.ch = (char*)malloc((T.length) * sizeof(char))))
        return 0;
    for(int i = 0; i < S1.length; i++)
    {
        *(T.ch + i) = *(S1.ch + i);
    }

    for(int i = 0; i < S2.length; i++)
    {
        *(T.ch + S1.length + i) = *(S2.ch + i);
    }
    return 0;
}

1.7求子串

// 用Sub返回串S的第pos个字符起长度为len的字串
int StrSub(HString& Sub, HString S, int pos, int len)
{
    if(len < 0 || pos > S.length || pos < 1 || len > S.length - pos + 1)
    {
        printf("str sub error! \n");
        return -1;
    }
    if(len == 0)
    {
        Sub.ch = NULL;
        Sub.length = 0;
    }
    else
    {
        Sub.ch = (char*)malloc(len * sizeof(char));
        for(int i = 0; i < len; i++)
        {
            *(Sub.ch + i) = *(S.ch + pos - 1 + i);
        }
        Sub.length = len;
    }
    return 0;
}

Comment