江月何年初照人… 2022-04-29 13:50 采纳率: 100%
浏览 60
已结题

完成以下实验任务实在不太行

img


按要求完成图片中的实验,并将代码图片以及运行结果发出,若嫌麻烦可加价。最好是今天晚上之前完成!时间比较紧!

  • 写回答

2条回答 默认 最新

  • 关注

    模拟实现string的操作。运行结果:

    img

    #include <iostream>
    using namespace std;
    
    class MyString
    {
        //(1)
    private:
        char* mPtr; //字符指针
    public:
        //(2)对私有变量的读写
        char* getPtr() { return mPtr; }
        void setPtr( char* p) { mPtr = p; } //这里是浅拷贝
        //(3)3个构造函数
        MyString() { mPtr = 0; }
        MyString(const char* p) 
        {
            int len = 0;
            int i = 0;
            while (p[len] != '\0')
            {
                len++;
            }
            mPtr = new char[len + 1];
            while (p[i] != '\0')
            {
                mPtr[i] = p[i];
                i++;
            }
            mPtr[i] = '\0';
        }
        MyString(int n)
        {
            mPtr = new char[n];
        }
        
        //(4)拷贝构造函数
        MyString(MyString& s)
        {
            if (mPtr)
            {
                delete[] mPtr;
            }
            int len = 0;
            int i = 0;
            while (s.mPtr[len] != '\0')
            {
                len++;
            }
            mPtr = new char[len + 1];
            while (s.mPtr[i] != '\0')
            {
                mPtr[i] = s.mPtr[i];
                i++;
            }
            mPtr[i] = '\0';
        }
        //赋值运算符重载
        void operator=(const MyString& s)
        {
            if (mPtr)
            {
                delete[] mPtr;
            }
            int len = 0;
            int i = 0;
            while (s.mPtr[len] != '\0')
            {
                len++;
            }
            mPtr = new char[len + 1];
            while (s.mPtr[i] != '\0')
            {
                mPtr[i] = s.mPtr[i];
                i++;
            }
            mPtr[i] = '\0';
        }
        //(5)析构函数
        ~MyString()
        {
            if (mPtr != 0)
            {
                delete[] mPtr;
                mPtr = 0;
            }
        }
        //(6)求字符串长度
        int length()
        {
            int len=0;
            if (mPtr == 0) return 0;
            while (mPtr[len] != '\0')
                len++;
            return len;
        }
        //(7)字符串拷贝
        void copy(MyString &p)
        {
            if (mPtr != 0)
            {
                delete[] mPtr;
            }
            int len = 0;
            int i = 0;
            while (p.mPtr[len] != '\0')
            {
                len++;
            }
            mPtr = new char[len + 1];
            while (p.mPtr[i] != '\0')
            {
                mPtr[i] = p.mPtr[i];
                i++;
            }
            mPtr[i] = '\0';
        }
        //或者直接拷贝char*
        void copy(const char* p)
        {
            int len = 0;
            int i = 0;
            if (mPtr != 0)
            {
                delete[] mPtr;
            }
            while (p[len] != '\0')
            {
                len++;
            }
            mPtr = new char[len + 1];
            while (p[i] != '\0')
            {
                mPtr[i] = p[i];
                i++;
            }
            mPtr[i] = '\0';
        }
        //(8)字符串查找
        int find(const char* p)
        {
            int i = 0;
            int j = 0;
            if (mPtr == 0)
                return -1;
            for (i = 0; mPtr[i] != '\0'; i++)
            {
                for (j = 0; p[j] != '\0'; j++)
                {
                    if (mPtr[i + j] == p[j])
                        continue;
                    else
                        break;
                }
                if (p[j] == '\0')
                    return i;
    
            }
            return -1;
        }
        //(9)插入
        char* insert(int pos, const char* p)
        {
            int len = length(); //计算当前串的长度
            int l2 = 0;
            if (pos < 0 || p == 0) return mPtr;
            if (pos >= len) return mPtr; //位置错误
    
            while (p[l2])
            {
                l2++;
            }
    
            if (len == 0 || mPtr == 0)
            {
                mPtr = new char[l2 + 1];
                int i = 0;
                while (p[i])
                {
                    mPtr[i] = p[i];
                    i++;
                }
                mPtr[i] = 0;
                return mPtr;
            }
            
            //
            char* ptmp = new char[len + l2 + 1];
            int k = 0;
            int j = 0;
    
            //复制pos之前的数据
            for (k = 0; k < pos; k++)
                ptmp[k] = mPtr[k];
            //复制p中的数据
            for (j = 0; p[j] != '\0'; j++)
            {
                ptmp[k] = p[j];
                k++;
            }
            //复制pos之后的数据
            for (j = 0; mPtr[j + pos] != '\0'; j++)
            {
                ptmp[k] = mPtr[j + pos];
                k++;
            }
            ptmp[k] = 0;
            
            //释放原来的空间
            delete[] mPtr;
            mPtr = ptmp;
            ptmp = 0;
            return mPtr;
        }
    
    };
    
    //(10)
    int main()
    {
        const char* p = "abcde";
        const char* p2 = "1234567890";
        //3种构造方法
        MyString s1;
        MyString s2(p);
        MyString s3(10);
    
        //拷贝构造函数
        MyString s4(s2);
        //赋值运算符
        MyString s5;
        s5 = s4;
    
        cout << s5.getPtr() <<"的长度为:" << s5.length() << endl; //输出s5的长度
    
        //调用拷贝函数
        s5.copy(p2);
        cout << "调用copy函数拷贝1234567890后,s5的内容:" << s5.getPtr() << endl; //输出拷贝后的字符串
    
        int index = s5.find("00");
        if (index == -1)
            cout << "00不在" << s5.getPtr() << "中" << endl;
        else
            cout << "00在" << s5.getPtr() << "的下标:" << index << endl;
    
        index = s5.find("234");
        if (index == -1)
            cout << "234不在" << s5.getPtr() << "中" << endl;
        else
            cout << "234在" << s5.getPtr() << "的下标:" << index << endl;
    
        //插入
        cout << s5.getPtr() << "在下标2处插入xxx后的字符串是:";
        const char* p3 = "xxx";
        cout << s5.insert(2, p3) << endl;
    
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月7日
  • 已采纳回答 4月29日
  • 创建了问题 4月29日

悬赏问题

  • ¥15 想问一下树莓派接上显示屏后出现如图所示画面,是什么问题导致的
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号