| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 587 人关注过本帖
标题:请问大家,为什么我感觉我的程序逻辑没错误,为什么结果不对呢
只看楼主 加入收藏
后卿
Rank: 4
来 自:网络
等 级:业余侠客
威 望:1
帖 子:302
专家分:295
注 册:2016-10-22
结帖率:81.71%
收藏
已结贴  问题点数:20 回复次数:4 
请问大家,为什么我感觉我的程序逻辑没错误,为什么结果不对呢
程序代码:
class hstring
{
private:
    unsigned short usmlen{};   //新建的内存长度
    char* cstr;             //字符串
    unsigned short uslen;    //字符串长度
}

 
hstring::hstring()
{
    cstr = NULL;     //指针初始化
    usmlen = 0x32;   //给予usmlen一个初始值,不然进入copystr函数后,无法与len进行比较
    uslen=0;
}
void hstring::copystr(char*& dest, const char* source)//这个copystr应该是没问题的,所以这整个函数没必要                            
                                                       //
{
    unsigned short len = getlength(source);
    if (len > usmlen)
    {
        dest = new char[len];   //重新分配内存
        uslen = len;
    }
    else
    {
        uslen = len;
        dest = new char[usmlen]; 
    }
    memcpy(dest, source, len);
    dest[len] = 0;
}
hstring::hstring(const char* _str) :hstring()
{
    copystr(cstr, _str);
}
unsigned short hstring::getlength(const char* str)
{
    unsigned short len{};//len局部变量
    for (; str[len]; len++);  //len包括了末尾0的长度
    return len;       //for循环计算出len的长度,返回它的值,即字符串str的长度
}
hstring& hstring::operator<<(const hstring& hstr)
{
    unsigned short hstrlen = getlength(hstr.cstr);//hstrlen表示传入的对象的字符串长度
    char* tempmem = cstr;  //先将cstr保存一份
    if (hstrlen + uslen > usmlen)  //uslen表示本对象的字符串长度
    {                                //如果内存不够就扩充内存
        cstr = new char[hstrlen + uslen]; //cstr表示本字符串
        memcpy(cstr, tempmem, uslen);
    }
    else
    {
        cstr = new char[0x32];
        memcpy(cstr, tempmem, uslen);
    }
    memcpy(cstr+uslen, hstr.cstr, hstrlen+1);//将传入的对象的字符串保存到本对象的字符串后面
    uslen = uslen + hstrlen - 1;//更新本对象的字符串长度
    return *this;
}
hstring& hstring::operator+(int val)
{
    char  str[12]{};  //定义一个字符串数组
    int length = 11;
    do 
    {
        str[length--] = val % 10 + 48;  //把val每个位数的数字依次放入str
    } while (val /= 10);
    return *this << &str[length] ;  //调用<<的重载
}

为什么我写
hstring hstr1="00000";
hstr1=hstr1+100000;   //调用operator+
std::cout<<hst1;
结果出不来呢,结果还是0000
搜索更多相关主题的帖子: char str short 字符串 unsigned 
2023-04-25 15:45
后卿
Rank: 4
来 自:网络
等 级:业余侠客
威 望:1
帖 子:302
专家分:295
注 册:2016-10-22
收藏
得分:0 
这时chatgpt的回答,但是我不理解
在operator+中,将int val转换成字符串str之后,并没有直接将它添加到本对象的字符串后面,而是调用了<<的重载运算符,将str作为hstring添加到了本对象的字符串后面。但是,在调用完这个操作之后,并没有删除str,也没有释放它占用的内存。因此,在调用完operator+后,本对象的字符串后面不是str,而是一个未被初始化的内存块。因此,当我们尝试输出本对象的值时,输出的结果就会是原来的字符串,而不是"00000100000"。要解决这个问题,可以在operator+运算符的末尾释放str占用的内存。
第二行,为什么要删除str,删不删除有影响吗
2023-04-25 16:40
东海ECS
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:Python
等 级:版主
威 望:32
帖 子:412
专家分:1646
注 册:2023-1-24
收藏
得分:20 
可能是在执行 operator+ 时出现了错误。可以在 operator+ 函数内加入输出语句,检查是否正确执行。

可能是在执行 operator<< 时出现了问题。可以在 operator<< 函数内加入输出语句,检查是否正确执行。

可能是在输出时出现了问题。可以输出 hstr1.cstr(即字符串本身)而非 hstr1,检查结果是否正确。

可能是在字符串长度计算时出现了问题。可以在 getlength 函数内加入输出语句,检查是否正确计算字符串长度。

可能是在数组下标计算时出现了问题。可以在 operator+ 函数内加入输出语句,检查是否正确计算数组下标。

可能是在内存分配时出现了问题。可以在分配内存前后加入输出语句,检查是否分配正确的内存大小,并且是否成功分配内存。

会当凌绝顶,一览众山小.
2023-04-25 18:44
后卿
Rank: 4
来 自:网络
等 级:业余侠客
威 望:1
帖 子:302
专家分:295
注 册:2016-10-22
收藏
得分:0 
回复 3楼 东海ECS
好的非常感谢
2023-04-25 18:48
后卿
Rank: 4
来 自:网络
等 级:业余侠客
威 望:1
帖 子:302
专家分:295
注 册:2016-10-22
收藏
得分:0 
回复 3楼 东海ECS
原来是我的operator+ 数组下标计算出现错误了,非常感谢大佬的提醒
 
2023-04-26 09:37
快速回复:请问大家,为什么我感觉我的程序逻辑没错误,为什么结果不对呢
数据加载中...
 
   



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

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