我的c风格字符串表现得非常奇怪

时间:2013-09-03 13:45:57

标签: c++ pointers c-strings

我创建了一个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;而不是[长度]。再次感谢您的回答!

3 个答案:

答案 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(不保证),否则重复调用将使您的函数难以置信缓慢。