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

来源:互联网 发布:三国志11兵种数据 编辑:程序博客网 时间:2024/05/15 06:01
#define _CRT_SECURE_NO_WARNINGS#include <cstring>#include <iostream>#include <future>#define MAX_BYTE    32typedef 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;}

欢迎大家批评指正

1 0
原创粉丝点击