我创建了一个String对象,它只包含一个char *字符串;会员。我通过将成员从我的对象复制到参数的成员而重载operator +,两者都变成了char *变量。但是由于某些原因,当我打印结果时,我得到了大约16个添加的giberish字符(转换超载是100%罚款)。我把它缩小到了char * sum = new char [length]这个问题。我检查了strlen(sum),它显示等于22,当它应该是6个字母长。任何人都知道问题可能是什么?
String String::operator+(const String& rhs)
{
int length = strlen(string) + strlen(rhs.string);
char* sum = new char[length];
for(int i=0;i<strlen(string);i++)
sum[i] = string[i];
for(int i=0;i<strlen(rhs.string);i++)
sum[strlen(string) +i] = rhs.string[i];
String s(sum);
return s;
}
编辑:现在胡言乱语已经消失了,但我仍然将=附加到我的结果中,例如:&#34; 1&#34; +&#34; 2&#34; +&#34; 3&#34;现在是&#34; 1 = 2 = 3&#34;。这是null终止符解释错误的结果吗?
再次编辑:没关系,真的很懒,设置[length + 1] =&#39; \ 0&#39;而不是[长度]。再次感谢您的回答!
答案 0 :(得分:11)
strlen
告诉你从字符串的开头到结尾的'\ 0'有多少字符,但不包括终止'\ 0'。分配新字符串时,必须为终止“\ 0”:
char *sum = new char[length + 1];
并在复制两个字符串后附加一个“\ 0”。
答案 1 :(得分:7)
您不为终止'\0'
字符分配内存。您必须为连接分配length+1
个字节。此外,您必须设置sum[length] = '\0'
。
答案 2 :(得分:7)
您正在分配length
个字符 - 这些空间不足以存储终止空值。此外,您不是在写一个终止空值。 C风格的字符串以空值终止。
并将strlen
的结果存储在局部变量中。除非编译器知道它可以安全地优化strlen
(不保证),否则重复调用将使您的函数难以置信缓慢。