| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 398 人关注过本帖, 1 人收藏
标题:为什么打印结果后面带着乱码呢
只看楼主 加入收藏
后卿
Rank: 4
来 自:网络
等 级:业余侠客
威 望:1
帖 子:302
专家分:295
注 册:2016-10-22
结帖率:81.71%
收藏(1)
已结贴  问题点数:2 回复次数:2 
为什么打印结果后面带着乱码呢
程序代码:
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还有两个乱码,有没有前辈知道怎么回事
搜索更多相关主题的帖子: unsigned const short start char 
2023-04-23 19:57
东海ECS
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:Python
等 级:版主
威 望:32
帖 子:412
专家分:1646
注 册:2023-1-24
收藏
得分:2 
是因为在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。

会当凌绝顶,一览众山小.
2023-04-24 18:53
后卿
Rank: 4
来 自:网络
等 级:业余侠客
威 望:1
帖 子:302
专家分:295
注 册:2016-10-22
收藏
得分:0 
回复 2楼 东海ECS
好的,非常感谢
之前忘记回复这个帖子了,我已经解决,我的解决方法是在operator()里面让newstr[length]=0
2023-04-24 19:29
快速回复:为什么打印结果后面带着乱码呢
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016189 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved