C++ string类实现

说明

如果想直接下载程序包请访问:https://github.com/ouzhiming/C-string-class
以下程序只能在Ubuntu下运行,我在VS2017下测试,总是出现错误,如果有人修改了这个错误,希望可以和我交流一下。这个程序目前还没写完,测试的也不够完善,欢迎大家指出不足和错误。

函数设计:CMyString.h

#ifndef _CMYSTRING_H
#define _CMYSTRING_H
#include <cstring>
#include <ostream>
#include <iostream>

class CMyString
{
        friend std::ostream& operator<<( std::ostream& os, const CMyString& str);
        private:
                char* m_pData; //  私有变量保存字符串
                int m_len;     //字符串的长度
        public:
                /*
                 * 构造函数
                 */
                CMyString(); //默认构造函数

                CMyString( const char* str ); // C字符串构造函数
                CMyString( const int &num, const char &c); //num个字符c
                CMyString( const char* str, const int &len);  //将C字符串前len个字符作为字符串s的初值。


                CMyString( const CMyString& str ); // 拷贝构造函数
                CMyString( const CMyString& str, const int &index); //从索引index的拷贝构造函数
                CMyString( const CMyString& str, const int &index, const int &len);//从索引index的、长度为len的拷贝构造函数


                ~CMyString( void ); // 析构函数


               /*
                *字符串操作函数
                */

                CMyString& operator=( const CMyString& str ); // 赋值运算符
                CMyString operator+( const CMyString& str ); // 字符串连接 
                bool operator==( const CMyString& str ); // 判断相等
                char operator[](const int idx ); // 数组索引
                int getLength(); // 返回长度

                char * getString();//返回C类型字符串

                void swap(CMyString &str1, CMyString &str2); //交换2个字符串的值
                CMyString & insert(CMyString str, const int &index); //在索引index处插入字符

                //std::ostream& operator<<(std::ostream& os, const CMyString& str);
                //std::ostream & operator<<(std::ostream & os);
};

#endif

函数实现:CMyString.cpp

#include "CMyString.h" 

using namespace std;
CMyString::CMyString()//默认构造函数
{
    this->m_len = 0;
    this->m_pData = new char(this->m_len + 1);
    this->m_pData[0] = '\0';
}

// C字符串构造函数
CMyString::CMyString(const char* str)
{
    if (!str){
        this->m_len = 0;
        this->m_pData = new char(this->m_len + 1);
        this->m_pData[0] = '\0';
    }
    else{
        this->m_len = strlen(str);
        this->m_pData = new char[this->m_len + 1];
        strcpy(this->m_pData, str);

        //另一种实现方式,strcpy_s保证缓冲区尺寸,避免发生不可预料的事,故这里使用strcpy_s
    //  strcpy_s(this->m_pData, this->m_len + 1, str);
    }

}

//num个字符c
CMyString::CMyString(const int &num, const char &c)
{
    if (num <= 0) {
        this->m_len = 0;
        this->m_pData = new char(this->m_len + 1);
        this->m_pData[0] = '\0';
    }
    else {
        this->m_len = num;
        this->m_pData = new char(this->m_len + 1);
        for (int i = 0; i < this->m_len; i++) {
            this->m_pData[i] = c;
        }
    }

}

//将C字符串前len个字符作为字符串s的初值。
CMyString::CMyString(const char* str, const int &len)
{
    if (len <= 0) {
        this->m_len = 0;
        this->m_pData = new char(this->m_len + 1);
        this->m_pData[0] = '\0';
    }
    else {
        int len_temp = strlen(str);
        if (len_temp >= len) {
            this->m_len = len;
            this->m_pData = new char(this->m_len + 1);

                strncpy(this->m_pData,str, this->m_len);
            this->m_pData[this->m_len + 1] = '\0'; //strncpy不会追加‘\0’,所以这里手动加
            /*for (int i = 0; i < this->m_len + 1; i++) {
                this->m_pData[i] = str[i];
            }*/
        }
        else{ //len大于字符串str本身的长度
            this->m_len = len_temp; 
            this->m_pData = new char(this->m_len + 1);
            //strcpy_s(this->m_pData, this->m_len + 1, str);
            strcpy(this->m_pData, str);
        }

    }

}

// 拷贝构造函数
CMyString::CMyString(const CMyString& str) 
{
    if (!str.m_len)
    {
        this->m_len = 0;
        this->m_pData = new char( this->m_len + 1);
        this->m_pData[0] = '\0';
    }
    else
    {
        this->m_len = str.m_len;
        this->m_pData = new char[this->m_len + 1];
    //  strcpy_s(this->m_pData, this->m_len + 1, str.m_pData);
        strcpy(this->m_pData, str.m_pData);
    }
}

//从索引index的拷贝构造函数
CMyString::CMyString(const CMyString& str, const int &index)
{
    if(str.m_len == 0 || index >= str.m_len){
        this->m_len = 0;
        this->m_pData = new char( this->m_len +1 );
        this->m_pData[0] = '\0';

    }
    else{
       this->m_len = str.m_len - index;
       this->m_pData = new char( this->m_len + 1);
       int j = 0;
       for(int i = index; i < str.m_len; i++){
            this->m_pData[j++] = str.m_pData[i];
       }

    }

}

//从索引index的、长度为len的拷贝构造函数
CMyString::CMyString(const CMyString& str, const int &index, const int &len)
{
     if(str.m_len == 0 || index >= str.m_len){
        this->m_len = 0;
        this->m_pData = new char( this->m_len +1 );
        this->m_pData[0] = '\0';

    }
    else{
       int j = 0;
       if(len <= str.m_len - index){
           this->m_len = len;
           this->m_pData = new char(this->m_len + 1);
           for(int i = index; i < index + len; i++){
              this->m_pData[j++] = str.m_pData[i];
          }  
       }
       else{
         this->m_len = str.m_len - index;
         this->m_pData = new char(this->m_len + 1);
         for(int i = index; i < str.m_len; i++){
                this->m_pData[j++] = str.m_pData[i];
         }
       }      
    }

}

//析构函数
CMyString::~CMyString( void )
{
        if ( this->m_pData)
        {   
                delete[] this->m_pData;
                this->m_len = 0;
                this->m_pData = 0;
        }
}

CMyString& CMyString::operator=( const CMyString& str)
{
    if (this == &str)
        return *this;
    else //如果2个地址不同
        {
                //先释放原来的字符串
                delete[] this->m_pData;
                if ( str.m_len == 0 )
                {
                    this->m_len = 0;
                    this->m_pData = new char(this->m_len + 1);
                    this->m_pData[0] = '\0';
                }
                else
                {
                    this->m_len = str.m_len;
                    this->m_pData = new char[this->m_len + 1 ];
                    //strcpy_s( this->m_pData, this->m_len + 1, str.m_pData );
                    strcpy(this->m_pData, str.m_pData);
                }
        }
        return *this;
}

CMyString CMyString::operator+( const CMyString& str )
{
        CMyString newString;
        if ( str.m_len == 0 )
        {
                newString = *this;
        }
        else if ( this->m_len == 0 )
        {
                newString = str;
        }
        else
        {
                newString.m_len = this->m_len + str.m_len;
                newString.m_pData = new char[newString.m_len + 1 ];
                //strcpy_s( newString.m_pData, newString.m_len + 1, this->m_pData );
                strcpy(newString.m_pData, this->m_pData);
                strcat( newString.m_pData, str.m_pData );
        }
        return newString;
}

bool CMyString::operator==( const CMyString& str )
{
        if ( this->m_len != str.m_len )
        {
                return false;
        }
        else
        {
                return strcmp( this->m_pData, str.m_pData ) ? false : true;
        }
}

char CMyString::operator[]( const int idx )
{
        if ( idx > 0 && idx < strlen( this->m_pData ) )
        return this->m_pData[idx];
}

int CMyString::getLength()
{
        return this->m_len;
}

std::ostream& operator<<( std::ostream& os, const CMyString& str )
{
        os<< str.m_pData;
        return os;
}
char * CMyString::getString() {

    return this->m_pData;
}

测试文件: main.cpp

#include "CMyString.cpp"
#include <iostream>

int main()
{
CMyString str("sly");
std::cout << str.getString() << std::endl;
    std::cout << str << std::endl;
CMyString str1;
    str1 = str;
    std::cout << str1 << std::endl;
    std::cout << str1[1] << std::endl;
    int len = str1.getLength();
    std::cout << "len = " << len << "   " << str1[len] << std::endl;
    if(str == str1)
       std::cout << "相等" << std::endl;
    str = str + str1;
    std::cout << str << std::endl;
    if(str == str1)
       std::cout << "相等" << std::endl;
    else
         std::cout << "不相等"<< std::endl;
    CMyString str2(10,'w');
    std::cout << str2 << std::endl;
    CMyString str3("asdfg123",5);
    std::cout << "str3 = "<< str3 << std::endl;
    CMyString str4(str3, 1);
    std::cout << "str4 = " <<  str4 << std::endl;
    CMyString str5(str3, 1, 9);
    std::cout << "str5 = " <<  str5 << std::endl;
    return 0;
}

参考文献

1.string类实现(C++):http://www.cnblogs.com/liwenbin/p/3724549.html
2.【C++】String类中的运算符重载:
http://blog.csdn.net/irean_lau/article/details/46400553

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值