当前位置: 首页 > article >正文

2024.8.29 C++

作业

仿照string类,实现myString

代码

#include <iostream>
#include <cstring>
using namespace std;
//仿照string完成myString类
class myString
{
    private:
        char *str;          //记录c风格的字符串
        int size;            //记录字符串的实际长度
    public:
        //无参构造
        myString():size(10)
        {
            str = new char[size];         //构造出一个长度为10的字符串
        }
        //有参构造
        myString(const char *s):size(strlen(s))            //有参构造     string  s("hello wirld");
        {
               str = new char[size+1];
               strcpy(str,s);
        }
        ~myString()             //定义析构函数,用于释放申请的空间
        {
            delete[] str;
        }
        //判空函数
        bool empty();
        //size函数
        int ssize();
        //c_str函数
        char *c_str();
        //at函数
        char &at(int index);
        void add(const char *s);
        //二倍扩容
        void expand();
};

bool myString::empty()      //判空函数
{
    return size == 0;
}

int myString::ssize()
{
    return size;
}

char *myString::c_str()     //传换成c风格的字符串
{
    return str;
}

char &myString::at(int index)   //返回元素
{
    return str[index];
}

void myString::add(const char *s)   //如果使用的是无参构造函数,需要进行字符串的写入使用该函数
{
    if(strlen(s) > (unsigned)size)  //检测是否默认申请的大小是否可以容纳下写入的字符串
    {
        expand();           //进行二倍扩充
    }
    strcpy(str,s);
}

void myString::expand() //二倍扩充
{
    size = 2 * size;    //默认的size*2
    char *temp = new char[size+1];  //申请一个大小为之前两倍的空间
    strcpy(temp,str);   //将之前的数据放入新的空间内
    char *p = str;      //准备释放原空间
    str = temp;         //原来的指针指向新的空间
    delete []p;         //删除原空间
}

int main()
{
    myString s1("hello world");     //使用有参构造函数并初始化为“hello world”
    s1.at(0) = 'H';             //把“hello world”的第一个元素'h'变成'H'
    printf("%s\n",s1.c_str());  //输出c语言风格的字符串
    cout << "size = " << s1.ssize() << endl;    //输出size,因为用的是有参构造函数,所以他的size就是字符串的大小

    myString s2;        //使用无参构造函数,初始默认的size为10
    s2.add("hello world");    //写入"hello world"
    printf("%s\n",s2.c_str());  //输出c语言风格的字符串
    cout << "size " << s2.ssize();  //输出size,因为"hello world"的大小是11,所以会进行二倍扩充,size就变成了20,字符串的长度是21
    return 0;
}

效果图

 

思维导图


http://www.kler.cn/news/283000.html

相关文章:

  • C#面:ASP.NET MVC 中还有哪些注释属性用来验证?
  • RKNPU2从入门到实践 ---- 【8】借助 RKNN Toolkit lite2 在RK3588开发板上部署RKNN模型
  • 设计模式--装饰器模式
  • 理解torch.argmax() ,我是错误的
  • 融资和融券分别是什么意思,融资融券开通后能融到多少资金?
  • Datawhale X 李宏毅苹果书 AI夏令营_深度学习基础学习心得Task2.2
  • Java 入门指南:Java NIO —— Selector(选择器)
  • 【hot100篇-python刷题记录】【搜索二维矩阵】
  • 分布式锁的实现:ZooKeeper 的解决方案
  • hive数据迁移
  • 低代码革命:JNPF平台如何简化企业应用开发
  • Linux 中的中断响应机制
  • TCP keepalive和HTTP keepalive区别
  • SCP拷贝失败解决办法
  • 基于单片机的指纹识别考勤系统设计
  • Web应用服务器Tomcat
  • 基于STM32开发的智能家居温度控制系统
  • Linux下的使用字符设备驱动框架编写ADC驱动 ——MQ-4传感器
  • 我在高职教STM32——ADC电压采集与光敏电阻(2)
  • rnn-手动实现
  • 区块链入门
  • Element Plus上传图片前,对图片进行压缩
  • 基于asp.net的webform图书管理系统附源码
  • django 中 csrf 的实现机制
  • CVE-2024-26229 漏洞复现分析
  • 详解PASCAL VOC数据集及基于Python和PyTorch的下载、解析及可视化【目标检测+类别分割】
  • 回归预测|基于北方苍鹰优化最小二乘支持向量机的数据预测Matlab程序NGO-LSSVM 多特征输入单输出 含基础程序
  • Qt5.15.x之后的版本源码编译安装
  • 生成式AI,搜索赛道的又一个黄金十年
  • Unity3D 遍历预制体