2019独角兽企业重金招聘Python工程师标准>>>

/*************************************************
CString Class From Microsoft MFC 
*************************************************/
#ifndef __CSTRING__
#define __CSTRING__
#include <string.h>
#include <stdio.h>
#include <time.h>
#ifndef LPCSTR
#define LPCSTR const char*
#define LPTSTR char*
#endif
#ifndef BOOL 
#define BOOL int
#endif
#ifndef TRUE 
#define TRUE -1
#define FALSE 0
#endif
#define NOTFOUND -1 //在字符串中找不到指定的字符或子串
class SafeBuffer {
public:
SafeBuffer(int nBufferLen) { if (nBufferLen > 0) m_pBuffer = new char[nBufferLen]; 
else m_pBuffer = 0; m_nLength = nBufferLen; memset(m_pBuffer, 0, nBufferLen);}
~SafeBuffer() { if(m_pBuffer) delete[] m_pBuffer; }
char* GetBuffer() { return m_pBuffer; }
operator char*() { return m_pBuffer; }
int GetLength() { return m_nLength; }
char * GetBufferSetLength(int nBufferLen);
private:
char* m_pBuffer;
int m_nLength;
};
inline LPTSTR SafeBuffer::GetBufferSetLength(int nBufferLen)
{
SafeBuffer sSave(m_nLength);
if(m_pBuffer)
{
memcpy(sSave,m_pBuffer,m_nLength);
delete [] m_pBuffer;
}
if(nBufferLen>0)
{
m_pBuffer = new char[nBufferLen +1];
memset(m_pBuffer,0,nBufferLen +1);
}
else m_pBuffer=NULL;
m_nLength = nBufferLen;
if(sSave.GetBuffer()!=NULL && m_pBuffer!=NULL)
{
int nSize;
nSize = m_nLength;
if(nSize > sSave.GetLength()) nSize = sSave.GetLength();
memcpy(m_pBuffer,sSave,nSize);
}
return m_pBuffer;
}
struct CStringData
{
long nRefs;             // reference count
int nDataLength;        // length of data (including terminator)
int nAllocLength;       // length of allocation
char* data()           // TCHAR* to managed data
{ return (char*)(this+1); }
CStringData()
{
nRefs = -1;
nDataLength = 0;
nAllocLength = 0;
}
};
class CString {
public:
// Constructors
// constructs empty CString
CString();
// copy constructor
CString(const CString& CStringSrc);
// from a single character
CString(char ch, int nRepeat = 1);
// from an ANSI CString (converts to char)
CString(LPCSTR lpsz);
// subset of characters from an ANSI CString (converts to char)
CString(LPCSTR lpch, int nLength);
// from unsigned characters
CString(const unsigned char* psz);
// Attributes & Operations
// get data length
int GetLength() const { return GetData()->nDataLength; }
// TRUE if zero length
BOOL IsEmpty() const { return GetData()->nDataLength == 0; }
// clear contents to empty
void Empty();
operator LPCSTR() const { return m_pchData; }
// overloaded assignment
// ref-counted copy from another CString
const CString& operator=(const CString& CStringSrc);
// set CString content to single character
const CString& operator=(char ch);
// copy CString content from ANSI CString (converts to char)
const CString& operator=(LPCSTR lpsz);
// copy CString content from unsigned chars
const CString& operator=(const unsigned char* psz);
// CString concatenation
// concatenate from another CString
const CString& operator+=(const CString& CString);
// concatenate a single character
const CString& operator+=(char ch);
// concatenate a UNICODE character after converting it to char
const CString& operator+=(LPCSTR lpsz);
//是否是数字,不包括"."
BOOL IsDigit() const;
//是否是数值
//chDot: 小数点字符,比如'.'或','
BOOL IsDecimal(char chDot) const;
friend CString  operator+(const CString& CString1,
const CString& CString2);
friend CString  operator+(const CString& CString, char ch);
friend CString  operator+(char ch, const CString& CString);
friend CString  operator+(const CString& CString, LPCSTR lpsz);
friend CString  operator+(LPCSTR lpsz, const CString& CString);
// CString comparison
// straight character comparison
int Compare(LPCSTR lpsz) const { return strcmp(m_pchData, lpsz); }
// simple sub-CString extraction
// return nCount characters starting at zero-based nFirst
CString Mid(int nFirst, int nCount) const;
// return all characters starting at zero-based nFirst
CString Mid(int nFirst) const;
// return first nCount characters in CString
CString Left(int nCount) const;
// return nCount characters from end of CString
CString Right(int nCount) const;
// upper/lower/reverse conversion
// NLS aware conversion to uppercase
void MakeUpper();
// NLS aware conversion to lowercase
void MakeLower();
// trimming whitespace (either side)
// remove whitespace starting from right edge
void TrimRight();
// remove whitespace starting from left side
void TrimLeft();
void Trim();
// advanced manipulation
// replace occurrences of chOld with chNew
int Replace(LPCSTR lpszOld, LPCSTR lpszNew);
// remove occurrences of chRemove
int Remove(char chRemove);
// insert character at zero-based index; concatenates
// if index is past end of CString
int Delete(int nIndex, int nCount = 1);
// searching
// find character starting at left, -1 if not found
int Find(char ch) const;
// find character starting at right
int ReverseFind(char ch) const;
// find character starting at zero-based index and going right
int Find(char ch, int nStart) const;
// find first instance of any character in passed CString
int FindOneOf(LPCSTR lpszCharSet) const;
// find first instance of subCString
int Find(LPCSTR lpszSub) const;
// find first instance of subCString starting at zero-based index
int Find(LPCSTR lpszSub, int nStart) const;
// simple formatting
// printf-like formatting using passed CString
void Format(LPCSTR lpszFormat, ...);
LPTSTR GetBuffer(int nMinBufLength);
// release buffer, setting length to nNewLength (or to first nul if -1)
void ReleaseBuffer(int nNewLength = -1);
// get pointer to modifiable buffer exactly as long as nNewLength
LPTSTR GetBufferSetLength(int nNewLength);
// release memory allocated to but unused by string
void FreeExtra();
// Use LockBuffer/UnlockBuffer to turn refcounting off
// turn refcounting back on
LPTSTR LockBuffer();
// turn refcounting off
void UnlockBuffer();
// Implementation
public:
~CString();
int GetAllocLength() const;
protected:
LPTSTR m_pchData;   // pointer to ref counted string data
// implementation helpers
CStringData* GetData() const { return ((CStringData*)m_pchData)-1; }
void Init();
void AllocCopy(CString& dest, int nCopyLen, int nCopyIndex, int nExtraLen) const;
void AllocBuffer(int nLen);
void AssignCopy(int nSrcLen, LPCSTR lpszSrcData);
void ConcatCopy(int nSrc1Len, LPCSTR lpszSrc1Data, int nSrc2Len, LPCSTR lpszSrc2Data);
void ConcatInPlace(int nSrcLen, LPCSTR lpszSrcData);
void CopyBeforeWrite();
void AllocBeforeWrite(int nLen);
void Release();
static void Release(CStringData* pData);
static int SafeStrlen(LPCSTR lpsz) {return (lpsz == NULL) ? 0 : strlen(lpsz); }
static void FreeData(CStringData* pData);
};
inline 
BOOL operator==(const CString& s1, const CString& s2)
{ return s1.Compare(s2) == 0; }
inline 
BOOL operator<=(const CString& s1, const CString& s2)
{ return s1.Compare(s2) <= 0; }
inline 
BOOL operator<(const CString& s1, const CString& s2)
{ return s1.Compare(s2) < 0; }
inline 
BOOL operator>=(const CString& s1, const CString& s2)
{ return s1.Compare(s2) >= 0; }
inline 
BOOL operator>(const CString& s1, const CString& s2)
{ return s1.Compare(s2) > 0; }
inline 
BOOL operator==(const CString& s1, LPCSTR s2)
{ return s1.Compare(s2) == 0; }
inline 
BOOL operator==(LPCSTR s1, const CString& s2)
{ return s2.Compare(s1) == 0; }
inline 
BOOL operator!=(const CString& s1, const CString& s2)
{ return s1.Compare(s2) != 0; }
inline 
BOOL operator!=(const CString& s1, LPCSTR s2)
{ return s1.Compare(s2) != 0; }
inline 
BOOL operator!=(LPCSTR s1, const CString& s2)
{ return s2.Compare(s1) != 0; }
inline
CString Space(int nLength) { return CString(' ', nLength); }
class NameList {
public:
NameList(LPCSTR pSeparator = ";"){m_strSeparator = pSeparator; }
NameList(NameList& names);
NameList& operator=(NameList& names);
NameList& operator=(CString& s);
void Put(LPCSTR pItem) { m_strList += pItem; m_strList += m_strSeparator; }
CString Get();
int GetItemCount();
BOOL IsEmpty() { return m_strList.IsEmpty(); }
CString ToString();
private:
CString m_strList;
CString m_strSeparator;
};
inline
NameList::NameList(NameList& names)
m_strList = names.m_strList;
m_strSeparator = names.m_strSeparator;
}
inline
NameList& NameList::operator=(NameList& names) 
m_strList = names.m_strList;
m_strSeparator = names.m_strSeparator;
return *this; 
}
inline
CString NameList::Get()
{
int iPos = m_strList.Find(m_strSeparator);
if (iPos == -1)
return CString();
CString sRet = m_strList.Left(iPos);
m_strList = m_strList.Mid(iPos + strlen(m_strSeparator));
return sRet;
}
inline 
CString NameList::ToString()
{
return m_strList;
}
inline
NameList& NameList::operator=(CString& s)
{
m_strList = s;
return *this;
}
//全局函数
//将i转换为字符串,不足的长度前补0,iLen为字符串的长度
CString itoa0(int iNo, int iLen);
//将i转换为字符串
CString itoa(int iNo);
//将整数转换为字符串,存放到buff中
//iDec表示进制,目前只能处理10以下的进制
void itoa(int iNo, char* buffer, int iDec = 10);
//将strADate和strATime转换为tm,cDatetime必须在调用本函数之前分配内存
BOOL atot(tm& cDatetime, const CString& strADate, const CString& strATime = "", BOOL bHasCentury = TRUE);
//将tm转换为字符串, 如果pTime = 0, 则只转换pDate, 转换失败返回FALSE
BOOL ttoa(tm& cDatetime, CString& strDate, CString& strTime, BOOL bHasCentury = TRUE);
#endif

转载于:https://my.oschina.net/u/558276/blog/63026

一个实用的String实现类(C++)相关推荐

  1. Android自己搭建一个实用的SharedPreferences管理类

    前言 在项目中经常会用到SharedPreferences来存储一些配置信息,比如用户的账号信息等.但是当项目大了之后如果还在要使用时再单独创建和使用SharedPreferences就会造成Shar ...

  2. 分享一个实用的String的工具类

    在编写J2ME程序时,我们尝尝要操作字符串,而原本在J2SE里面提供了很多String的操作方法,在J2ME里面是没有的,这些方法我们得自己手动去写.我整理了一下我常用的字符串操作方法: 1.URLE ...

  3. php的图像处理有哪些实际作用,PHP_一个经典实用的PHP图像处理类分享,本图像处理类可以完成对图片 - phpStudy...

    一个经典实用的PHP图像处理类分享 本图像处理类可以完成对图片的缩放.加水印和裁剪的功能,支持多种图片类型的处理,缩放时进行优化等. /** file: image.class.php 类名为Imag ...

  4. 一个实用分数类Fraction的Java实现

    一个实用分数类Fraction的Java实现 目录 一个实用分数类Fraction的Java实现 自言自语环节(请无视) 关于本类的简要说明 代码内容 成员变量 构造方法 计算相关方法 属性set/g ...

  5. 如何实现一个具备基本功能函数的C++的自定义String字符串类

    在这篇文章,我们创造一个自定义的C++字符串类,它具备基本的string操作功能. 为什么要创建自己的字符串类呢?其中的一个原因是,当你想要让自己的字符串类型区别于一般的string时,你就需要自定义 ...

  6. java轻量级并行工具类_16 个超级实用的 Java 工具类

    原标题:16 个超级实用的 Java 工具类 源 /juejin 在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法按使用流行度排名, ...

  7. Hutool核心工具类之Convert万能转换器\String工具类之StrUtil\对象工具-ObjectUtil\数组工具-ArrayUtil\随机工具-RandomUtil等等

    Hutool核心,包括Bean操作.日期.各种Util等 <一>:Convert万能转换器. (1):转换为字符串 long[] b = {1,2,3,4,5}; //bStr为:&quo ...

  8. 一天一个Java基础——对象和类

    1.在Java中你所做的全部工作就是定义类,产生那些类的对象,以及发送消息给这些对象 2.可以在类中设置两种类型的元素:字段(也被称作数据成员)和方法(也被称作成员函数) 3.字段可以是任何类型的对象 ...

  9. java输入字符串异常_设计一个 Java 程序,自定义异常类,从命令行(键盘)输入一个字符串,如果该字符串值为“XYZ”。。。...

    设计一个 Java 程序,自定义异常类,从命令行(键盘)输入一个字符串,如果该字符串值为"XYZ",则抛出一个异常信息"This is a XYZ",如果从命令 ...

最新文章

  1. LeetCode Search in Rotated Sorted Array II
  2. TaskTracker获取并执行map或reduce任务的过程(一)
  3. Python下载网络图片方法汇总与实现
  4. 一个完整的项目流程图_工程建设项目史上最完整的全流程图,必收藏备用!
  5. 【解决】小程序要求的 TLS 版本必须大于等于 1.2
  6. Srs之state-threads研究
  7. c语言求45678所有非平凡因子,近世代数基础习题课答案到第二章9题
  8. steam怎么看邮箱绑定的账号_【一问一答】账号篇丨账号密码忘记了怎么办?不方,看这里!...
  9. matlab 机械动力学仿真,基于MATLAB的机器人动力学仿真与控制.PDF
  10. JDK8之后下一个版本使用什么及JDK版本的简单介绍
  11. Axure RP 介绍
  12. CDH集群更换ip,主机名
  13. Java8中关于LocalDateTime转换方法总结
  14. 【web漏洞】弱口令
  15. 学习操作系统的关键一步!
  16. [AV1] 谈谈AV1中的 S-Frame
  17. ZUI + SSM框架下数据表格的使用
  18. 地质勘查土质分类图片_收藏必备!自然资源部:岩石、砾质、土质、泥质统一这样划分!...
  19. C语言 输入一个长度小于80的字符串,将字符串中的字母字符滤掉掉,并统计新生成串中包含的字符个数。
  20. 机器学习驱动的语言测试

热门文章

  1. 20200705:力扣196周周赛上
  2. tsql 正则_sql里的正则表达式
  3. python批量移动文件_用python批量移动文件
  4. 判断EXCEL表格某单元格值发生改变VBA代码
  5. 不使用软盘加载驱动安装系统的方法--使用nLite集成驱动
  6. GitHub发布年度机器学习榜:TensorFlow最火,PyTorch失踪,Julia第四
  7. 阿里开源深度学习框架XDL,面向高维稀疏数据,支持千亿参数训练规模
  8. 亚马逊遭遇15万人联名抗议:AI刷脸可以,但卖给政府不OK
  9. 全球最大的第一视角视频数据集开源,取自真实生活,还能提升厨艺
  10. “众矢之的”马库斯回应14个问题,将深度学习质疑到底