本土Concat方法的问题

时间:2011-05-24 19:35:52

标签: c++ string concat

我已经实现了自己的String类,需要编写Concat方法。

我无法让它发挥作用。

我的代码是:

//the m_str is private member which is initialize in the c-tor
//this function is get a string and concat it with the original string
String &String::Concat(const char *string)
{
    int original_str_size = length(m_str);
    int other_str_size = length(string);
    int needed_length = original_str_size + other_str_size + 1;

    char *str_copy = m_str;

    del();

    m_str = new char[needed_length];
    m_size = needed_length;

    int index = 0;

    for(; index < original_str_size; index++)
    {
        if(index < original_str_size)
            m_str[index] = str_copy[index];
        else
            m_str[index] = string[index];
    }

    m_str[index] = 0;

    return *this;
}

Concat方法中的问题是我写了类似的内容:

String word3 = word1.Contact(word2);

它应该使word3word1+word2类似,但是当我运行它时程序失败了。

当我写道:

cout << word1.Contact(word2).Length();

...它仅打印word 1的长度,而不是组合长度。

3 个答案:

答案 0 :(得分:1)

让我们检查以下代码:

int index = 0;
for(; index < original_str_size; index++)
{
    if(index < original_str_size)
        m_str[index] = str_copy[index];
    else
        m_str[index] = string[index];
}

查看你的循环条件,然后查看你的if条件。显然,else块永远不会执行,并且你的字符串永远不会连接。

要解决此问题,您的循环条件应替换为needed_length。然后,您必须将string[index]替换为string[index - original_str_size]才能获得string中的正确索引。

您的代码应如下所示:

int index = 0;
for(; index < needed_length; index++)
{
    if(index < original_str_size)
        m_str[index] = str_copy[index];
    else
        m_str[index] = string[index - original_str_size];
}

另一方面,str_copy指向的是什么?这是有效的记忆吗? del()释放了记忆吗?可能想检查一下。

答案 1 :(得分:0)

在比较中,你有一个;在for循环之后,这意味着循环什么都不做。当第一个字符匹配时,你也返回0.

在Concat中,您正在创建str_copy = m_str,然后可能会删除m_str并创建新的m_str。然后你从已删除的m_str复制到新的m_str,你可能会很幸运,但我不会依赖它。

答案 2 :(得分:0)

在你的Concat函数中,在将字符串从该内存中复制到新分配的内存之前,看起来你正在删除包含原始字符串的内存。