c++ - 我的 C 风格字符串表现得很奇怪

标签 c++ pointers c-strings

我创建了一个 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/

相关文章:

c++ - C和C++相对于一元算术运算符存在差异的原因是什么 +

C 字符串段错误

c++ - 在c++ solaris中编译多个文件

c++ - InstallShield 在安装时不安装可再发行的 VC++

java - 访问 JNA 指针的对等值

c - 从参数为 4 的 c 函数返回一个字符串

c - C 中 strncpy 的总线错误

C++ 指针赋值

c++ - 在没有 Xcode 的 Mac Bundle 中嵌入框架

c - 为什么 struct hostent 中的 h_addr_list 是 char ** 而不是 struct in_addr **?