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

请问大家,为什么我感觉我的程序逻辑没错误,为什么结果不对呢

后卿 发布于 2023-04-25 15:45, 684 次点击
程序代码:

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
4 回复
#2
后卿2023-04-25 16:40
这时chatgpt的回答,但是我不理解
在operator+中,将int val转换成字符串str之后,并没有直接将它添加到本对象的字符串后面,而是调用了<<的重载运算符,将str作为hstring添加到了本对象的字符串后面。但是,在调用完这个操作之后,并没有删除str,也没有释放它占用的内存。因此,在调用完operator+后,本对象的字符串后面不是str,而是一个未被初始化的内存块。因此,当我们尝试输出本对象的值时,输出的结果就会是原来的字符串,而不是"00000100000"。要解决这个问题,可以在operator+运算符的末尾释放str占用的内存。
第二行,为什么要删除str,删不删除有影响吗
#3
东海ECS2023-04-25 18:44
可能是在执行 operator+ 时出现了错误。可以在 operator+ 函数内加入输出语句,检查是否正确执行。

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

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

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

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

可能是在内存分配时出现了问题。可以在分配内存前后加入输出语句,检查是否分配正确的内存大小,并且是否成功分配内存。
#4
后卿2023-04-25 18:48
回复 3楼 东海ECS
好的非常感谢
#5
后卿2023-04-26 09:37
回复 3楼 东海ECS
原来是我的operator+ 数组下标计算出现错误了,非常感谢大佬的提醒
 
1