C++CString 字符串拷贝

//
//  CString2.hpp
//  CString
//
//  Created by Mr.peng on 2014/8/29.
//  Copyright © 2014年 Mr.peng. All rights reserved.
//

#ifndef CString2_hpp
#define CString2_hpp

// CString2 优化版本的CString 增强版本

#include <stdio.h>
#include <iostream>
#include <string.h>

class CString2
{
public:
    
    int GetLenght() const{ return strlen(m_pData );}
    operator const char* (){ return m_pData; }
    
    CString2(const char* p);
    CString2(const CString2& str);
    CString2();
    ~CString2();
    
    CString2 &operator=(const CString2& str);
    CString2 &operator=(const char* str);
    CString2 &operator+=(const CString2& str);
    CString2 operator+(const CString2& str2);
    int Find(const char* pszSub,int Size = 0);
    int Find(char ch,int iStart = 0 );
    //void MakeLower(char* str);
    CString2 MakeLower(CString2 str);
    CString2 &MakeLower();
    CString2& MakeUpper();
    
    CString2& MakeReverse();
    CString2 Mid(int iFirst,int nCount) const;
    
    CString2 Mid(int iFirst) const {
       return Mid(iFirst, m_nLenght - iFirst);
    }
    
    //从左边开始截取到底几个
    CString2 Left(int nCount) const {
        return Mid(0, nCount);
    }
    
    //从滴几个开始截取
    CString2 Right(int nCount) const {
        return Mid(m_nLenght - nCount, nCount);
    }
    
    char operator[](int nIndex) const{
        
        return m_pData[nIndex];
    }
    
    char &operator[](int nIndex){
        return m_pData[nIndex];
    }
    
private:
    int m_nLenght;
    char* m_pData;
    CString2(int nLen){
        m_pData = new char[nLen+1];
        m_nLenght = nLen;
    }
    
};

#endif /* CString2_hpp */
 

 

CString ---- CPP

 

//
//  CString2.cpp
//  CString
//
//  Created by Mr.peng on 2014/8/29.
//  Copyright © 2014年 Mr.peng. All rights reserved.
//

#include "CString2.hpp"

CString2::CString2(const char* p){
    int nLen = strlen(p);
    m_pData = new char[nLen+1];
    strcpy(m_pData,p);
    m_nLenght = nLen;
}

CString2::CString2(const CString2& str){
    int nLen = str.m_nLenght;
    m_pData = new char[nLen+1];
    strcpy(this->m_pData,str.m_pData);
    m_nLenght = nLen;
}


CString2::CString2(){
    m_nLenght = 0;
    //m_pData = new char(0);
    m_pData = new char[1];
    m_pData[0] = '\0';
    
}

CString2::~CString2(){
    delete []m_pData;
}

//对象间赋值
CString2 &CString2::operator=(const CString2& str){
    int nLen = str.m_nLenght;
    if (m_nLenght < nLen) {
        delete []m_pData;
        m_pData = new char[nLen+1];
    }
    strcpy(m_pData, str.m_pData);
    m_nLenght = nLen;
    
    return *this;
}

CString2 &CString2::operator=(const char* str){
    int nLen = strlen(str);
    if (nLen > m_nLenght) {
        delete []m_pData;
        m_pData = new char[nLen+1];
    }
    strcpy(m_pData,str);
    m_nLenght = nLen;
    
    return *this;
}

CString2 &CString2::operator+=(const CString2& str){
    int nLen = m_nLenght + str.m_nLenght;
    char *p = new char[nLen+1];
    strcpy(p,m_pData );
    strcpy(p+m_nLenght, str.m_pData);
    delete []m_pData;
    m_pData = p;
    m_nLenght = nLen;
    
    return *this;
}

CString2 CString2::operator+(const CString2& str2){
    CString2 str;
    int nlen = m_nLenght + str2.m_nLenght;
    delete []str.m_pData;
    str.m_pData = new char[nlen+1];
    //再把左值赋值进来
    strcpy(str.m_pData,m_pData);
    //再把右值复制进来
   // strcat(str.m_pData,str2.m_pData);
    strcpy(str.m_pData+m_nLenght,str2.m_pData);
    str.m_nLenght = nlen;
    
    
    return str;
}

//根据ASII 码转换大小写
CString2 CString2::MakeLower(CString2 str){
    CString2 str2 = str;
    int nlen = strlen(str2);
    for (int i = 0; i < nlen; i++) {
        if (str2[i] >= 'a' && str2[i] <= 'z') {
            str2[i] = towupper(str2[i]);
        }else if(str2[i] >= 'A' && str2[i] <= 'Z'){
            str2[i] = towlower(str2[i]);
        }
    }
    
    return str2;
}

//根据ASII 码转换大小写
CString2 &CString2::MakeLower(){
    int nlen = strlen(m_pData);
    for (int i = 0; i < nlen; i++) {
        if (m_pData[i] >= 'a' && m_pData[i] <= 'z') {
            m_pData[i] = towupper(m_pData[i]);
        }else if(m_pData[i] >= 'A' && m_pData[i] <= 'Z'){
            m_pData[i] = towlower(m_pData[i]);
        }
    }
    
    return *this;
}

//字符串反转
CString2& CString2::MakeReverse(){
    char *p = m_pData;
    char *q = m_pData+m_nLenght;
    while (p < --q) {
        char t = *p;
        *p = *q;
        *q = t;
        ++p;
       // --q;  //这里--q会把‘\0’带入返回的字符串就是为空
    }
    
    return *this;
}

//字符截取
CString2 CString2::Mid(int iFirst,int nCount) const{
    if(iFirst >= m_nLenght)
        return CString2();
    if (nCount + iFirst > m_nLenght)
        nCount = m_nLenght - iFirst;
    CString2 str_Mid;
    delete []str_Mid.m_pData;
    //重新分配一个空间
    str_Mid.m_pData = new char[nCount+1];
    //从当前的字符串拷贝
    memcpy(str_Mid.m_pData, m_pData+iFirst, nCount);
    str_Mid.m_pData[nCount] = 0;
    str_Mid.m_nLenght = nCount;
    
    return str_Mid;
}

//从第几个开始截取,保留剩下的
//CString2 CString2::Mid(int iFirst) const{
//    //判断当前截取的字符长度是否大于当前原有的长度
//    if (iFirst >= m_nLenght)
//        // 如果大于原有长度 返回一个空字符串
//        return CString2(); //无名对象
//    CString2 str(m_nLenght - iFirst);
//                        //起始位置
//    memcpy(str.m_pData, m_pData + iFirst,m_nLenght - iFirst);
//    str.m_pData[m_nLenght-iFirst] = '\0';
//    
//    return str;
//}

//int Find(const char* pszSub,int Size = 0){
//    
//    return 
//}

int CString2::Find(char ch,int iStart){
    if(iStart >= m_nLenght)
        return -1;
    char *p = strchr(m_pData + iStart, ch);
    if (!p)
        return -1;
    
    return p - m_pData;
}

 

CPP  ---- main

 

int main(int argc, const char * argv[]) {

    CString s1 = "abc",s2 = "-xyz";

    s1 += s2;

    std::cout << s1 << std::endl;

    return 0;

    

}

 

/*

int main(int argc, const char * argv[]) {

    

    CString s4("All rights reserved",8); //截断方式字符串

    CString s1 = "abc",s2 = "-xyz";

    //CString s = s1+s2;

    CString s = s1;  //深拷贝

    CString s3('*',8);

   // s1 = s2;  //直接赋值是属于浅拷贝

    CString s5;

    s5 = s4 = "123456";

    

    if (s1 == s4)

        std::cout << "相等" << std::endl;

    else

        std::cout << "不相等" << std::endl;

    if ("123456" != s4)

        std::cout << "不等" << std::endl;

    else

        std::cout << "相等" << std::endl;

    

    int i = 0;

    while (i < s.GetLength()) {

        printf("%c",s[i]);

        ++i;

    }

 

    

    std::cout << s1 << std::endl;

    std::cout << s2 << std::endl;

    std::cout << s << std::endl;

    std::cout << s4 << std::endl;

    

    printf("%d \n",s1.GetLength());

    printf("%d \n",s2.GetLength());

    std::cout << s.GetLength() << std::endl;

    std::cout << s3 << std::endl;

    std::cout << s4 << "\n" << s5 << std::endl;

    

    //类型转换字符串

    const char *p = s1; //C++字符串与C语言字符串;

    

    

    return 0;

}

 */

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值