2

我创建了一个 String 对象,它只包含一个 char* 字符串;成员。我通过将对象中的成员而不是参数的成员复制到 char * 变量中来重载 operator+。但是由于某种原因,当我打印结果时,我得到了大约 16 个添加的乱码字符(转换过载是 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;

}

编辑:现在乱码消失了,但我的结果仍然有 =,例如:“1”+“2”+“3”现在是“1=2=3”。这是空终止符解释错误的结果吗?

再次编辑:没关系,真的很糟糕并设置 [length+1] = '\0' 而不是 [length]。再次感谢您的精彩回答!

4

3 回答 3

11

strlen告诉您从字符串的开头到终止符 '\0' 有多少个字符,但不包括终止符。当你分配一个新字符串时,你必须为终止的 `\0' 留出空间:

char *sum = new char[length + 1];

并在复制两个字符串后附加一个 `\0'。

于 2013-09-03T13:48:35.923 回答
7

您不为终止'\0'字符分配内存。您必须为连接分配length+1字节。此外,您必须设置sum[length] = '\0'.

于 2013-09-03T13:47:47.460 回答
7

您正在分配length字符 - 没有足够的空间来存储终止的空值。此外,您没有编写终止空值。C 风格的字符串以空值结尾。

并将结果存储strlen在局部变量中。除非编译器知道它可以安全地优化strlen(不能保证),否则重复调用会使你的函数非常慢。

于 2013-09-03T13:48:42.960 回答