m0_73565969 2023-03-18 16:09 采纳率: 53.8%
浏览 32
已结题

>>运算符重载会出错,应该怎么改


#include<iostream>
#include<cstring>

using namespace std;
char* p=nullptr;

class String
{
private:
    char* pStr;
    int size;
public:
    String(const char* pn = nullptr);
    ~String();
    String(const String& S);
    void set(const char* pn);

    String operator+(const String& S);
    bool operator<(const String& S)const;
    friend ostream& operator<<(ostream& out, const String& S);
    friend istream& operator>>(istream& in, String& S);
};

String::String(const char* pn)
{
    if (pn)
    {
        pStr = new char[strlen(pn) + 1];
        strcpy_s(pStr, strlen(pn) + 1, pn);
    }
    else
    {
        pStr = new char[1];
        *pStr = '\0';
    }
    size = strlen(pStr);
}

String::~String()
{
    if(pStr)
        delete[]pStr;
}

String::String(const String& S)
{
    size = S.size;
    if (S.pStr)
    {
        pStr = new char[strlen(S.pStr) + 1];
        strcpy_s(pStr, strlen(S.pStr) + 1, S.pStr);
    }
    else
    {
        pStr = new char[1];
        *pStr = '\0';
    }
}

void String::set(const char* pn)
{
    delete[]pStr;
    pStr = new char[strlen(pn) + 1];
    strcpy_s(pStr, strlen(pn) + 1, pn);
    size = strlen(pStr);
}

String String::operator+(const String& S)
{
    if (p)
        delete[]p;
    p = new char[strlen(pStr) + strlen(S.pStr) + 1];
    strcpy_s(p, strlen(pStr)+1,pStr);
    strcat_s(p, strlen(pStr) + strlen(S.pStr) + 1, S.pStr);
    return String(p);
}

bool String::operator<(const String& S)const
{
    return (size < S.size);
}

ostream& operator<<(ostream& out, const String& S)
{
    out << S.pStr ;
    return out;
}

istream& operator>>(istream& in, String& S)
{
    in >> S.pStr;
    return in;
}

int main()
{
    String s1, s2("hello"), s3;
    cin >> s1;
    cout << s1 << endl;
    cout << s1+s2<< endl;
    if (p)
        delete[]p;
}

img

  • 写回答

2条回答 默认 最新

  • Lee_Chill 2023-03-18 16:58
    关注

    在 operator>> 函数中,输入的字符串长度可能超过 String 对象内部指针所指向的内存块的长度,从而导致内存溢出。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月15日
  • 已采纳回答 3月7日
  • 创建了问题 3月18日

悬赏问题

  • ¥15 问题遇到的现象和发生背景 360导航页面千次ip是20元,但是我们是刷量的 超过100ip就不算量了,假量超过100就不算了 这是什么逻辑呢 有没有人能懂的 1000元红包感谢费
  • ¥30 计算机硬件实验报告寻代
  • ¥15 51单片机写代码,要求是图片上的要求,请大家积极参与,设计一个时钟,时间从12:00开始计时,液晶屏第一行显示time,第二行显示时间
  • ¥15 用C语言判断命题逻辑关系
  • ¥15 原子操作+O3编译,程序挂住
  • ¥15 使用STM32F103C6微控制器设计两个从0到F计数的一位数计数器(数字),同时,有一个控制按钮,可以选择哪个计数器工作:需要两个七段显示器和一个按钮。
  • ¥15 在yolo1到yolo11网络模型中,具体有哪些模型可以用作图像分类?
  • ¥15 AD9910输出波形向上偏移,波谷不为0V
  • ¥15 淘宝自动下单XPath自动点击插件无法点击特定<span>元素,如何解决?
  • ¥15 曙光1620-g30服务器安装硬盘后 看不到硬盘