在 C++ 中实现自己的字符串类

implementing own string class in c++

本文关键字:字符串 自己的 实现 C++      更新时间:2023-10-16

我知道这里有一个类似的问题。但是我的实现有点不同,

class String {
    private:
        char* str;
        long int length;
    public:
        String() {
            str = NULL;
            length = 0;
        }
        void input() {
            char c;
            while((c = getchar()) != 'n') {
                str = new char[length + 1];
                length++;
                str[length - 1] = c;
            }
            str = new char[length + 1];
            str[length] = '';
        }
        long int getLength() {
            return length;
        }
        void display() {
            for(int i = 0; i < length; i++)
                cout<<str[i];
        }
        ~String() {
            delete[] str;
            length = 0;
        }
};
int main(void) {
    String s;
    s.input();
    cout<<s.getLength()<<endl;
    s.display();
    cout<<endl;
    return 0;
}

在此代码中,出于某种原因,我的显示函数给出了奇怪的结果。谁能帮我这个功能?

void appendChar(char c) {
    if (length + 2 >= capacity) { // one for append and one for null byte
        capacity += 128;
        char *newPtr = new char[capacity];
        if (length > 0) {
            strcpy(newPtr, str);
        }
        if (str != NULL) {
            delete [] str;
        }
        str = newPtr;
    }
    str[length++] = c; // append the character
    str[length] = 0; // add a null byte so it's zero terminated
}

然后从读取方法调用此方法,而不是自己执行额外的操作。

while((c = getchar()) != 'n') {
    appendChar(c);
}

你会注意到我使用了一个新的类字段 - 容量。

输入法似乎没有做你期望它做的事情,这个:

while((c = getchar()) != 'n') {
                str = new char[length + 1];

将为每个字符输入创建一个新的 char[],因此在显示字符串时,您会得到随机垃圾。

此外,在循环之后,您还可以执行以下操作:

}
            str = new char[length + 1];

再次创建一个新的字符指针数组,但从未实际获取前一个指针的内容。

为了解决这个问题,使用您的获取输入的方法,我会做一些事情,例如将 char[] 的初始大小设置为某个任意数字(例如 8(,并且仅在读取超过 8 个字符时才分配更多内存。 之后,您可以分配两倍的大小,复制上一个 char[] 的内容并使用 getchar(( 继续读取。

希望这有帮助