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

时间:2019-02-08 18:14:23

标签: c++ string

我知道存在类似的问题here。 但是我的实现有些不同,

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] = '\0';
        }
        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;
}

在这段代码中,由于某种原因,我的显示功能给出了奇怪的结果。 有人可以帮我这个功能吗?

2 个答案:

答案 0 :(得分:2)

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
}

然后从您的read方法中调用此方法,而不是自己做多余的事情。

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

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

答案 1 :(得分:1)

输入法似乎没有达到您的期望,

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

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

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

}
            str = new char[length + 1];

再次创建一个新的char指针数组,但从未真正获取上一个char指针的内容。

要解决此问题,请使用您获取输入的方法,例如将char []的初始大小设置为任意数字(例如8),并在读取8个以上字符时才分配更多内存。之后,您可以分配此大小的两倍,复制前一个char []的内容,然后继续使用getchar()进行读取。

希望这会有所帮助