C++ 개념 공부/자료구조

[C++] String 클래스 구현

taene_ 2023. 10. 31. 21:11
#include <iostream>
namespace ya
{
    class string
    {
    public:
        string(const char* str)
        {
            int len = strlen(str);
            mArr = new char[len + 1];
            mLen = len;
            memset(mArr, 0, len + 1);

            for (int i = 0; i < len; i++)
                mArr[i] = str[i];
        }
        int length()
        {
            return mLen;
        }
        const char* c_str()
        {
            return mArr;
        }
        char operator[](int idx)
        {
            return mArr[idx];
        }
        void operator+=(const char* str)
        {
            int len = strlen(str);
            int len2 = mLen;
            char* buff = mArr;

            mArr = new char[mLen + len + 1];
            mLen = mLen + len + 1;
            memset(mArr, 0, mLen);

            for (int i = 0; i < len2; i++)
            {
                mArr[i] = buff[i];
            }
            for (int i = 0; i < len; i++)
            {
                mArr[i + len2] = str[i];
            }

            delete buff;
        }
        void resize(int size)
        {
            char* buff = mArr;
            mArr = new char[size + 1];
            memset(mArr, 0, size + 1);

            for (int i = 0; i < size; i++)
            {
                mArr[i] = buff[i];
            }
            mLen = size + 1;

            delete buff;
        }
        void resize(int size, char c)
        {
            char* buff = mArr;
            mArr = new char[size + 1];
            memset(mArr, 0, size + 1);

            if (size + 1 > mLen)
            {
                for (int i = 0; i < mLen - 1; i++)
                {
                    mArr[i] = buff[i];
                }
                for (int i = 0; i < size + 1 - mLen; i++)
                {
                    mArr[i + mLen - 1] = c;
                }
                mLen = size + 1;
            }
            else
                std::cout << "error";

            delete buff;
        }
        bool empty()
        {
            if (mArr[0] == '\0')
                return true;
            else
                return false;
        }
        void clear()
        {
            for (int i = 0; i < mLen; i++)
            {
                mArr[i] = NULL;
            }
        }
        int find(const char* str)
        {
            int lenA = strlen(mArr);
            int lenB = strlen(str);
            bool isSame = false;
            int answerIndex = 0;
            for (int i = 0; i < lenA; i++)
            {
                for (int j = 0; j < lenB; j++)
                {
                    if (mArr[i] != str[j])
                        break;
                    else
                    {
                        int indexA = i;
                        int indexB = j;
                        answerIndex = i;
                        for (int k = 0; k < lenB; k++)
                        {
                            if (mArr[indexA++] == str[indexB++])
                                isSame = true;
                            else
                            {
                                isSame = false;
                                break;
                            }
                        }
                        if (isSame)
                            return answerIndex;
                        else
                            continue;
                    }
                }
            }
            return 99999;   // Find Nothing, error
        }
        bool operator==(const char* str)
        {
            int len = strlen(str);
            if (mLen == len + 1)
            {
                for (int i = 0; i < strlen(str); i++)
                {
                    if (mArr[i] != str[i])
                        return false;
                }
                return true;
            }
            else
                return false;
        }

    private:
        char* mArr;
        int mLen;
    };
}

int main()
{
    // STL String Test
    std::string stl("Hello");
    int len = stl.length();
    const char* ptr = stl.c_str();
    char ch = stl[1];
    stl += "World";

    // User-Defined Function String Class 
    ya::string yam("Hello");
    int len2 = yam.length();
    const char* ptr2 = yam.c_str();
    ch = yam[0];
    yam += "World";

    yam.resize(12, '+');
    yam.resize(10);

    bool isSame = (yam == "HelloWorld");
    bool isDifferent = (yam == "HelloWorld+");

    int a = yam.find("or");
    int b = yam.find("rlda");

    yam.clear();
    bool isEmpty = yam.empty();

    return 0;
};