第三课--之一(对象)实现MyString类的作业

本文介绍了一个自定义的MyString类的实现细节,包括字符串的创建、操作、修改等功能。该类支持字符串的拼接、查找替换及整数、浮点数的添加等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#define _CRT_SECURE_NO_WARNINGS
#include <cstring>
#include <iostream>
#include <future>


#define MAX_BYTE    32
typedef unsigned int UINT;

class MyString
{
public:
    MyString()
    {
        _len = 1;
        _index = 0;
        _str = nullptr;
    }
    MyString(const char *str)
    {
        _index = _len = strlen(str);
        _str = new char[_len + sizeof(char)];
        strcpy(_str, str);
    }
    ~MyString()
    {
        if (_str)
            delete _str;
    }
    // 设置字符串
    void SetString(const char *str)
    {
        size_t len = strlen(str);

        if (len > _len)
        {
            SetArray(len);
        }

        strcpy(_str, str);
        _index = len + 1;
    }
    // 获取字符串
    const char *GetString() const
    {
        return _str;
    }
    char GetCharByIndex(UINT index)
    {
        char cRet = 0;

        if (index < _index)
            cRet = _str[index];

        return cRet;
    }
    // 获取字符串长度
    size_t GetLenghtOfString()
    {
        return _index;
    }
    // 获取数组长度
    size_t GetLengthofArray()
    {
        return _len;
    }
    // 修改其中指定的字符为另一个字符
    UINT SetChars(const char cSrc, const char cDst)
    {
        UINT iRet = 0;

        for (UINT i=0; i<_index; ++i)
        {
            if (cSrc == _str[i])
            {
                _str[i] = cDst;
                ++iRet;
            }
        }
        return iRet;
    }
    // 查找替换当中所有的字符串
    UINT ReplaceWords(const char *strSrc, const char *strDst)
    {
        UINT iRet = GetSubStrNumber(strSrc), tmpIndex = _len;
        char *strTmp = new char[_len];
        memcpy(strTmp, _str, _len);
        size_t srcLen = strlen(strSrc), dstLen = strlen(strDst);

        do 
        {
            if (0 == iRet)  break;

            if (dstLen > srcLen)
            {
                if (iRet*(dstLen-srcLen)+_index > _len)
                {
                    SetArray(iRet*(dstLen - srcLen) + _index);
                }
            }

            for (UINT i = 0; i<tmpIndex; )
            {
                if (0 == strncmp(strTmp+i, strSrc, srcLen))
                {
                    for (UINT j=0; j<dstLen; ++j)
                    {
                        _str[_index++] = strDst[j];
                    }
                    i += srcLen;
                }
                else
                {
                    _str[_index++] = strTmp[i++];
                }
            }

        } while (false);

        return iRet;
    }
    // 向字符串的末尾添加一个字符
    void Append(const char c)
    {
        if (_index + sizeof(char) > _len)
        {
            char *tmpStr = new char[_len];
            UINT tmpIndex = _index;
            memcpy(tmpStr, _str, _len);
            SetArray(_index + sizeof(char));
            memcpy(_str, tmpStr, _len);
            _index = tmpIndex;
        }
        _str[_index++] = c;
    }
    // 在末尾添加一个字符串
    void Append(const char *str)
    {
        if (nullptr != str)
        {
            size_t len = strlen(str);
            for (UINT i=0; i<len; ++i)
            {
                Append(str[i]);
            }
        }
    }
    // 向字符串的末尾添加一个整数
    void Append(int iVal)
    {
        char temp[MAX_BYTE] = { 0 };

        sprintf(temp, "%d", iVal);
        Append(temp);
    }
    // 向字符串中添加浮点数
    void Append(const double dVal)
    {
        char temp[MAX_BYTE] = { 0 };
        sprintf(temp, "%lf", dVal);
        Append(temp);
    }
    // 向字符串添加MyString对象
    void Append(const MyString &myStr)
    {
        Append(myStr.GetString());
    }

private:
    // 设置数组,调整数字的大小,并分配空间
    void SetArray(size_t len)
    {
        while (_len < len)
        {
            _len *= 2;
        }

        if (_str)
            delete[]_str;

        _index = 0;
        _str = new char[_len];
        memset(_str, 0, _len);
    }

    // 获取子字符串的个数
    UINT GetSubStrNumber(const char *subStr)
    {
        UINT iRet = 0;
        size_t subStrSize = strlen(subStr);
        char *tmp = _str;

        while (true)
        {
            tmp = strstr(tmp, subStr);

            if (nullptr != tmp)
            {
                ++iRet;
            }

            if (tmp-_str+subStrSize < _len)
            {
                tmp += subStrSize;
            }
            else
            {
                break;
            }
        }

        return iRet;
    }


private:
    char *_str;     // 字符串指针
    UINT _index;    // 当前字符串的索引,_index位置可以直接加字符的
    size_t _len;    // 数组的长度
};


int main()
{
    MyString str("abcdjjkdhfjk abc jk nfkjh slhghjfuiabciuvh");

    UINT ret = str.ReplaceWords("abc", "slhghjfuiabciuvhslhghjfuiabciuvh");
    std::cout << str.GetString() << std::endl;
    str.Append('a');
    std::cout << str.GetString() << std::endl;
    str.Append("456");
    std::cout << str.GetString() << std::endl;
    str.Append(123);
    std::cout << str.GetString() << std::endl;
    str.Append(654.123456789);
    std::cout << str.GetString() << std::endl;

    MyString strAppend;
    strAppend.SetString("Hello World!");
    std::cout << strAppend.GetString() << std::endl;
    str.Append(strAppend);
    std::cout << str.GetString() << std::endl;

    return 0;
}

欢迎大家批评指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值