首页 > 解决方案 > 自定义字符串类的奇怪输出

问题描述

我正在尝试在 C++ 中创建一个自定义字符串类。但是,当我尝试输出字符串的值时,我得到的值+一堆垃圾。

班级:

unsigned str_len;
char* str_val; // Both set as private in the header file

str::string::string(const char* value) {
    if (value) {
        unsigned n = 0;
        while (value[n] != '\0')
            n++;

        str_val = new char[n];
        str_len = n;

        for (unsigned i = 0; i < n; i++)
            str_val[i] = value[i]; 
    }
    else {
        str_val = new char[0];
        str_len = 0;
    }
}

unsigned str::string::len() { return str_len; }

char* str::string::val() {
    char* value = new char[str_len];

    for (unsigned i = 0; i < str_len; i++)
        value[i] = str_val[i];

    return value;
}

主文件:

int main() {
    str::string test("test");
    std::cout << "String length: " << test.len() << std::endl;
    std::cout << "String value: " << test.val() << std::endl;
}

预期输出:

String length: 4
String value: test

实际输出:

String length: 4
String value: test²²²²¼s╜ù÷f

标签: c++

解决方案


您缺少新字符串末尾的 '\0' 。它没有被复制到 str_val 中(你只是短暂地停下来)。

由于您似乎希望 str_len 表示可打印字符的数量,因此我建议您将 value 分配为更大,并将最后一个字符设为 '\0'。

char* str::string::val() {
    char* value = new char[str_len + 1];

    for (unsigned i = 0; i < str_len; i++)
        value[i] = str_val[i];
    value[str_len] = '\0';
    return value;
}

推荐阅读