我创建了一个 String 对象,它只包含一个 char* 字符串;成员。我通过从我的对象中复制成员而不是参数的成员来重载 operator+,两者都复制到 char * 变量中。但出于某种原因,当我打印结果时,我得到了大约 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]。再次感谢您的精彩回答!
最佳答案
strlen
告诉您从字符串开头到但不包括终止符“\0”的字符数。当你分配一个新的字符串时,你必须为终止的'\0'留出空间:
char *sum = new char[length + 1];
并在复制这两个字符串后附加一个“\0”。
关于c++ - 我的 C 风格字符串表现得很奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18593967/