注册 登录
编程论坛 C++教室

为什么打印结果后面带着乱码呢

后卿 发布于 2023-04-23 19:57, 58 次点击
程序代码:

class hstring
{
private:
    unsigned short usmlen{};   //新建的内存长度
    char* cstr;             //字符串
    unsigned short uslen;    //字符串长度
    unsigned short getlength(const char* str);     //得到对象的字符串长度
    void copystr(char*& dest, const char* source);   //复制内存函数
public:
    hstring(const char* _str);
    hstring(const hstring& hstr);
    hstring& operator=(const hstring& str);
    const hstring operator()(unsigned short start,unsigned short length);
    ~hstring();
    //hstring& operator= (const char* str);
    char* getstr()
    {
        return cstr;
    }
};
hstring::hstring()
{
    cstr = nullptr;      
    usmlen = 0x32;      
}
unsigned short hstring::getlength(const char* str)
{
    unsigned short len{};
    for (; str[len]; len++);
    return len;
}
void hstring::copystr(char*& dest, const char* source)
{
    unsigned short len = getlength(source);
    if (len > usmlen)
    {
        delete cstr;
        dest = new char[len + 1];   //重新分配内存
        usmlen = len;
    }
    uslen = len;
    dest = new char[0x32];
    memcpy(dest, source, usmlen);
}
hstring::hstring(const char* _str) :hstring()
{
    copystr(cstr, _str);
}
hstring::hstring(const hstring& hstr) : hstring()
{
    copystr(cstr, hstr.cstr);
}
hstring& hstring::operator=(const hstring& hstr)
{
    copystr(cstr, hstr.cstr);
    return *this;
}
const hstring hstring::operator()(unsigned short start, unsigned short length)
{
    if (start > uslen - 1)
    {
        return hstring(" ");
    }
    //unsigned short strlen{};
   
//strlen = start + length > uslen - 1 ? uslen - 1 - start : length;
   
//char* newcstr = new char[strlen+1];
    char* newcstr = new char[length + 1];
    memcpy(newcstr, cstr+start, length+1);
    return hstring(newcstr);
}
int main()
{
    hstring hstr1="54321";
    hsring hstr2=hstr1(0,2);
    std::cout<<hstr2;
}

这里应该输出54,但是输出了 54还有两个乱码,有没有前辈知道怎么回事
2 回复
#2
东海ECS2023-04-24 18:53
是因为在hstring类的成员函数copystr中,在重新分配内存之后,又立即使用了原本被释放的内存,导致了乱码的出现。修改copystr函数如下,即可解决问题:

程序代码:
void hstring::copystr(char*& dest, const char* source)
{
    unsigned short len = getlength(source);
    if (len > usmlen)
    {
        delete[] cstr;
        dest = new char[len + 1];   //重新分配内存
        usmlen = len;
    }
    uslen = len;
    memcpy(dest, source, len + 1);
}

此外,在main函数中,输出hstr2的时候需要使用hstr2.getstr()来获取其存储的字符串,因为hstring类没有定义其与std::cout直接输出的关联。因此,写成std::cout<<hstr2.getstr()即可正确输出54。
#3
后卿2023-04-24 19:29
回复 2楼 东海ECS
好的,非常感谢
之前忘记回复这个帖子了,我已经解决,我的解决方法是在operator()里面让newstr[length]=0
1