PoEdu培训 C++班 第三课 作业 实现自己的字符串类
文章类别: 培训作业 0 评论

PoEdu培训 C++班 第三课 作业 实现自己的字符串类

文章类别: 培训作业 0 评论

实现自己的字符串类

#include <cstring>
#include <iostream>
#include <cstdarg>

using namespace std;

#define TMP_STR_LEN (100)

class HadesString
{
private:
    char* _szStr = nullptr;
    int _iLen = 0;

    // 检查并清空字符串和长度的值
    bool CheckAndFreeMember()
    {
        if (_iLen > 0 && _szStr)
            delete[] _szStr;
        _iLen = 0;
        _szStr = nullptr;

        return true;
    }

    // 设置字符串和长度的值
    bool SetMemberValue(const char* str)
    {
        bool bRet = false;
        do
        {
            _iLen = strlen(str);
            _szStr = new char[_iLen + sizeof(char)];
            strcpy(_szStr, str);
            bRet = true;
        } while (false);

        return bRet;
    }

    // 给字符串添加内容
    bool AppendContent(const char* szFmt, size_t nContentSize, ...)
    {
        bool bRet = false;

        char* szResult = nullptr;

        do
        {
            int iNewSize = _iLen + sizeof(char) * 2 + nContentSize;

            va_list args;
            va_start(args, nContentSize);
            //__crt_va_start(args, nContentSize);

#if defined _NO_CRT_STDIO_INLINE
            ;
#else
            {
                szResult = new char[iNewSize];
                memset(szResult, 0x00, sizeof(szResult));

#pragma warning(push)
#pragma warning(disable: 4996) // Deprecation
                _vsprintf_l(szResult, szFmt, NULL, args);
#pragma warning(pop)
            }
#endif

            va_end(args);
            //__crt_va_end(args);

            if (!CheckAndFreeMember())
                break;

            if (!SetMemberValue(szResult))
                break;

            bRet = true;

        } while (false);

        if (szResult)
            delete[] szResult;

        return bRet;
    }


public:

    HadesString(char* str = "Hello Hades!")
    {
        SetMemberValue(str);
    }

    // 析构函数
    ~HadesString()
    {
        delete[] _szStr;
        _iLen = 0;
    }

    // 获取字符串长度 记录的
    int GetLen()
    {
        return _iLen;
    }

    // 获取字符串
    char* GetString()
    {
        return _szStr;
    }

    // 设置字符串
    char* SetString(char* str)
    {
        char* szRet = nullptr;
        do
        {
            if (!CheckAndFreeMember())
                break;

            if (!SetMemberValue(str))
                break;

            szRet = _szStr;
        } while (false);

        return szRet;
    }

    // 获得某个下标的字符
    char GetChar(size_t index)
    {
        char cRet = 0;

        do
        {
            if (index >= _iLen)
                break;
            cRet = _szStr[index];
        } while (false);

        return cRet;
    }

    // 获取数组长度
    size_t GetLenOfArray()
    {
        return _iLen + sizeof(char);
    }

    // 获取字符串长度
    size_t GetLenOfStr()
    {
        return strlen(_szStr);
    }

    // 替换字符串中的字符为另一个(全部替换)
    char* ReplaceChar(const char cSrc, const char cTarget)
    {
        char* szRet = nullptr;

        for (size_t i = 0; i < _iLen; i++)
        {
            if (cSrc == _szStr[i])
            {
                _szStr[i] = cTarget;
            }
        }
        szRet = _szStr;

        return szRet;
    }

    // 替换字符串(全部替换)
    char* ReplaceStr(const char* szSrc, const char* szTarget)
    {
        char* szRet = nullptr;
        char* szOrig = nullptr;

        do
        {
            size_t iSzSrcSize = strlen(szSrc);
            if (_iLen < iSzSrcSize)
                break;

            szOrig = new char[_iLen + sizeof(char)];
            memset(szOrig, 0x00, sizeof(szOrig));
            strcpy(szOrig, _szStr);
            int iLenOrig = _iLen;

            if (!CheckAndFreeMember())
                break;

            if (!SetMemberValue(""))
                break;

            size_t iIndex = 0;
            for (; iIndex < iLenOrig - iSzSrcSize; )
            {
                if (strncmp((szOrig + iIndex), szSrc, strlen(szSrc)) == 0)
                {
                    AppendContent("%s%s", strlen(szTarget), _szStr, szTarget);
                    iIndex += strlen(szSrc);
                }
                else
                {
                    AppendContent("%s%c", sizeof(char), _szStr, szOrig[iIndex]);
                    iIndex++;
                }
            }
            
            for (; iIndex < iLenOrig; iIndex++)
            {
                AppendContent("%s%c", sizeof(char), _szStr, szOrig[iIndex]);
            }

            szRet = _szStr;
        } while (false);

        if (szOrig)
            delete[] szOrig;

        return szRet;
    }

    // 查找字符串
    char* FindStr(const char* szStr)
    {
        int iIndex = 0;
        bool bFindResult = 0;
        char* szResult = nullptr;

        do
        {
            size_t iSzStrSize = strlen(szStr);
            if (_iLen < iSzStrSize)
                break;

            for (; iIndex < _iLen - iSzStrSize; iIndex++)
            {
                if (strncmp((_szStr + iIndex), szStr, strlen(szStr)) == 0)
                {
                    bFindResult = true;
                    break;
                }
            }
            if (bFindResult)
            {
                szResult = _szStr + iIndex;
            }
        } while (false);

        return szResult;
    }

    // 结尾增加字符
    char* Append(const char c)
    {
        char* szRet = nullptr;

        do
        {
            if (!AppendContent("%s%c", sizeof(c), _szStr, c))
                break;
            szRet = _szStr;
        } while (false);

        return szRet;
    }

    // 结尾增加字符串
    char* Append(const char* szStr)
    {
        char* szRet = nullptr;

        do
        {
            if (!AppendContent("%s%s", strlen(szStr), _szStr, szStr))
                break;
            szRet = _szStr;
        } while (false);

        return szRet;
    }

    // 结尾增加整数
    char* Append(int iVal)
    {
        char* szRet = nullptr;

        do
        {
            char szTmp[TMP_STR_LEN] = { 0 };
            sprintf_s(szTmp, TMP_STR_LEN, "%d", iVal);

            if (!AppendContent("%s%d", strlen(szTmp), _szStr, iVal))
                break;
            szRet = _szStr;
        } while (false);

        return szRet;
    }

    // 结尾增加浮点数
    char* Append(double dVal)
    {
        char* szRet = nullptr;

        do
        {
            char szTmp[TMP_STR_LEN] = { 0 };
            sprintf_s(szTmp, TMP_STR_LEN, "%f", dVal);

            if (!AppendContent("%s%f", strlen(szTmp), _szStr, dVal))
                break;
            szRet = _szStr;
        } while (false);

        return szRet;
    }

    // 结尾增加HadesString
    char* Append(const HadesString& hstr)
    {
        char* szRet = nullptr;

        do
        {
            char* szTmp = const_cast<HadesString&>(hstr).GetString();
            if (!AppendContent("%s%s", strlen(szTmp), _szStr, szTmp))
                break;
            szRet = _szStr;
        } while (false);

        return szRet;
    }

    // 头部弹出字符
    char* PopCharFromHead()
    {
        char* szRet = nullptr;
        char* szResult = nullptr;

        do
        {
            szResult = new char[_iLen];
            memset(szResult, 0x00, sizeof(szResult));
            strcpy(szResult, _szStr + 1);

            if (!CheckAndFreeMember())
                break;

            if (!SetMemberValue(szResult))
                break;
            szRet = _szStr;
        } while (false);

        if (szResult)
            delete[] szResult;

        return szRet;
    }

    // 尾部弹出字符
    char* PopCharFromTail()
    {
        char* szRet = nullptr;
        char* szResult = nullptr;

        do
        {
            szResult = new char[_iLen + sizeof(char)];
            memset(szResult, 0x00, sizeof(szResult));
            int iCopyLen = strlen(_szStr) - 1;
            strcpy(szResult, _szStr);
            szResult[iCopyLen] = '\0';

            if (!CheckAndFreeMember())
                break;

            if (!SetMemberValue(szResult))
                break;
            szRet = _szStr;
        } while (false);

        if (szResult)
            delete[] szResult;

        return szRet;
    }
};

int main()
{
    HadesString str("Hello Hades! ");

    cout << "原始字符串:[" << str.GetString() << "]" << endl;
    cout << "设置字符串:[Hades Studio!!! HaHaha, NaN, OtoO. Http://www.hxhlb.org]" << endl;
    str.SetString("Hades Studio!!! HaHaha, NaN, OtoO. Http://www.hxhlb.org");
    cout << "设置后的字符串:[" << str.GetString() << "]" << endl;
    cout << "获取第2个字符:[" << str.GetChar(1) << "]" << endl;
    cout << "字符串长度:[" << str.GetLenOfStr() << "]" << endl;
    cout << "字符串长度2:[" << str.GetLen() << "]" << endl;
    cout << "数组长度:[" << str.GetLenOfArray() << "]" << endl;
    cout << "修改字符H为T:[" << str.ReplaceChar('H', 'T') << "]" << endl;
    cout << "还原修改字符:[" << str.ReplaceChar('T', 'H') << "]" << endl;
    cout << "查找:[ha]:[" << str.FindStr("ha") << "]" << endl;
    cout << "替换:[Ha --> hA]:[" << str.ReplaceStr("Ha", "hA") << "]" << endl;
    cout << "替换:[ha --> HA]:[" << str.ReplaceStr("hA", "Ha") << "]" << endl;
    cout << "替换:[Ha --> hxhlb]:[" << str.ReplaceStr("Ha", "hxhlb") << "]" << endl;
    cout << "替换:[hxhlb --> Ha]:[" << str.ReplaceStr("hxhlb", "Ha") << "]" << endl;
    cout << "末尾追加[H]:[" << str.Append('H') << "]" << endl;
    cout << "末尾追加[Hades]:[" << str.Append("Hades") << "]" << endl;
    cout << "末尾追加[666]:[" << str.Append(666) << "]" << endl;
    cout << "末尾追加[888.123456]:[" << str.Append(888.123456) << "]" << endl;
    HadesString strAppend("HTTP://WWW.HXHLB.ORG");
    cout << "新的字符串对象:[" << strAppend.GetString() << "]" << endl;
    cout << "末尾追加新的字符串对象:[" << str.Append(strAppend) << "]" << endl;
    cout << "弹出第一个字符:[" << str.PopCharFromHead() << "]" << endl;
    cout << "弹出第一个字符:[" << str.PopCharFromHead() << "]" << endl;
    cout << "弹出最后一个字符:[" << str.PopCharFromTail() << "]" << endl;
    cout << "弹出最后一个字符:[" << str.PopCharFromTail() << "]" << endl;
    cout << "最终结果:[" << str.GetString() << "]" << endl;

    system("pause");

    return 0;
}

如有错误,请提出指正!谢谢.

回复