标准C++实现字符串类CString

本文详细介绍了如何使用C++实现一个名为CString的字符串类,包括构造函数、内存管理、字符串操作如追加、替换等核心功能。通过动态内存分配和内存管理,保证了字符串操作的效率和安全性。
摘要由CSDN通过智能技术生成

// String.cpp: implementation of the CString class.
//
//

#include "String.h"
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <ctype.h>

#if defined(WIN32)
#include <windows.h>
#elif defined(linux)
#elif defined(_AIX)
 #include <extension.h>
#else
#endif
#ifdef _xlC
        #include <strings.h>
#endif
#include "macros.h"
#include "String.h"
using namespace clib;

// constructors

// allocate buffers
CString::CString(int iBufferNum)     
{
 m_pBuffer = new char[iBufferNum * STR_PAGE_SIZE];      //动态申请内存
 m_nLength = 0;                                        //长度
 m_nSize   = iBufferNum * STR_PAGE_SIZE;                //字符串大小初始化为iBufferNum个4*1024
 m_pDataStart = m_pDataEnd = m_pBuffer;               //开始字符串指针全部指向m_pBuffer
}

// new one character
CString::CString(char c, int iBufferNum)        //参数为字符c和iBufferNum,构造函数
{
 char data[2], len = 2;   

 data[0] = c;                      //将c放在字符数组首位
 data[1] = 0;                      //将字符数组data第二位置为0
 if (len > iBufferNum * STR_PAGE_SIZE)       //如果iBufferNum个4*1024小于3
 {
  m_pBuffer = new char[len + 1]; //为字符串类的主要字符串m_pBuffer动态申请内存空间
  m_nSize   = len + 1;         //字符串大小为3
 }
 else
 {
  m_pBuffer = new char[iBufferNum * STR_PAGE_SIZE];     //字符串申请内存空间   
  m_nSize   = iBufferNum * STR_PAGE_SIZE;
 }

 // copy data and set total length
 CreateFromData(data, len);            //根据字符数组data开始创建对象m_pDataStart和m_pDataEnd
}
// copy data from a null terminated string
CString::CString(const char *data, int iBufferNum)
{
 long len = strlen(data);

 if (len > iBufferNum * STR_PAGE_SIZE)     //字符串的大小大于制定数量个4*1024
 {
  m_pBuffer = new char[len + 1]; // 动态申请内存空间
  m_nSize   = len + 1; 
 }
 else
 {
  m_pBuffer = new char[iBufferNum * STR_PAGE_SIZE];
  m_nSize   = iBufferNum * STR_PAGE_SIZE;
 }

 // copy data and set total length
 CreateFromData(data, len);        //根据字符数组data开始创建对象m_pDataStart和m_pDataEnd  
}

// copy data from a binary data
CString::CString(const char *data, long len, int iBufferNum)   //构造函数的参数为字符串
{
 if (len > iBufferNum * STR_PAGE_SIZE)         //如果字符串的大小大于制定数量个4*1024
 {
  m_pBuffer = new char[len + 1]; // 动态申请内存空间
  m_nSize   = len + 1; 
 }
 else
 {
  m_pBuffer = new char[iBufferNum * STR_PAGE_SIZE];
  m_nSize   = iBufferNum * STR_PAGE_SIZE;
 }

 // copy data and set total length
 CreateFromData(data, len); //根据字符数组data开始创建对象m_pDataStart和m_pDataEnd  
}

// destructor
CString::~CString(void)
{
 SafeDestroy();
}

// destroy allocated memory space and init all pointers
void CString::SafeDestroy(void)
{
 SAFEDELETE(m_pBuffer);
 // Important for InitPointers()
 m_nSize = 0;
 Empty();
}


void CString::Empty(void)                
{
#ifdef WIN32
 ZeroMemory(m_pBuffer, m_nSize);
#else // Linux, AIX
 memset(m_pBuffer, 0, m_nSize);
#endif
 m_pDataStart = m_pDataEnd = m_pBuffer;        //将该字符串的头指针和尾指针全部指向字符串的头部
 m_nLength = 0;                               //字符串长度置为0
}

char *CString::GetData(void) const          //获得指向该字符串的头部指针
{
 return m_pDataStart;
}


int CString::CreateFromData(const char *data, long len)         //根据data和长度len创建对象
{

 Empty();      //清空

    if (len <= 0)   
  return TRUE;

    if (data == NULL)
  return TRUE;

 // actually, it's impossible
 if (len > m_nSize)
  return FALSE;

 // copy data and set length
 memcpy(m_pDataStart, data, len);    //将字符数组复制给m_pDataStart指向内存空间
 m_nLength = len;              
 m_pDataStart[m_nLength] = '\0';      
 m_pDataEnd = &(m_pDataStart[m_nLength]);      //取得尾指针m_pDataEnd

 return TRUE;
}


long CString::GetLength(void) const
{
 return m_nLength;
}


int CString::IsEmpty(void) const
{
 return !m_nLength;
}


int CString::Grow(int iBufferNum)
{
 //unsigned char *pNewSpace = NULL;

 if (iBufferNum <= 0)  
  

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值