我已经实现了自己的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);
它应该使word3
与word1+word2
类似,但是当我运行它时程序失败了。
当我写道:
cout << word1.Contact(word2).Length();
...它仅打印word
1的长度,而不是组合长度。
答案 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函数中,在将字符串从该内存中复制到新分配的内存之前,看起来你正在删除包含原始字符串的内存。