//
// 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;
}
*/