C ++字符串附加函数奇怪的行为

时间:2016-02-29 00:51:12

标签: c++ string printf

我有一个正在处理的字符串类的追加函数部分,并且在使用时发生了一些非常奇怪的事情。当我在函数内打印附加的字符串,然后在main中打印出来时,它可以正常工作。但是当我在函数内部注释掉打印部分并将打印件保留在main中时,输出是一些随机字符。这是代码:

String.cpp:

void String::append(const String buf)
{
    char c[99];

    for (auto i = 0; i < this->length(); ++i) {
        c[i] = this->cstr()[i];
    }

    for (auto i = this->length(); i < (this->length() + buf.length() + 1); ++i) {
        c[i] = buf.cstr()[i - this->length()];
    }

    *this = c;
    printf("%s\n", *this); // if I comment this line out then the append function doesn't work properly
}

主:

int main()
{
    String a = "Hello";
    String b = "Hi";
    a.append(b);
    printf("%s\n", a);
}

当使用两种打印功能时,输出为:

仅使用main中的打印功能时:

可能导致这种情况的原因是什么?感谢。

编辑:

作业运营商:

String &String::operator=(char* buf) {
    _buffer = buf;
    return *this;
}

构造

String::String(char* buf) : _buffer(buf), _length(0) {
    setLength();
}

1 个答案:

答案 0 :(得分:2)

char c[99];

是具有自动存储持续时间的数组。离开c函数后,使用指向第一个元素(又名append())的指针是未定义的行为。

通过赋值运算符存储它不会保存数据或防止数据被删除。

为了保持数据,您需要使用new和delete处理动态分配(这将是一些努力,考虑构造函数,析构函数,赋值,复制构造函数/赋值)或者您需要将数据复制到您先前分配的缓冲区。

有关复制字符数组的方法,请参阅this question