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

Or *_*ser 2 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;

}
Run Code Online (Sandbox Code Playgroud)

编辑:现在胡言乱语已经消失了,但我仍然将=附加到我的结果中,例如:"1"+"2"+"3"现在是"1 = 2 = 3".这是null终止符解释错误的结果吗?

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

Pet*_*ker 11

strlen告诉你从字符串的开头到结尾的'\ 0',但不包括多少个字符.分配新字符串时,必须为终止"\ 0"留出空间:

char *sum = new char[length + 1];
Run Code Online (Sandbox Code Playgroud)

复制两个字符串后附加一个"\ 0".


Osw*_*ald 7

您没有为终止'\0'字符分配内存.您必须length+1为串联分配字节.此外,你必须设置sum[length] = '\0'.


Seb*_*edl 7

您正在分配length字符 - 这个空间不足以存储终止空值.此外,您不是在写一个终止空值.C风格的字符串以空值终止.

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