设为首页 加入收藏

TOP

标准C++实现字符串类CString(一)
2014-11-24 03:17:21 来源: 作者: 【 】 浏览:3
Tags:标准 实现 字符串 CString

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

#include "String.h"
#include
#include
#include
#include
#include

#if defined(WIN32)
#include
#elif defined(linux)
#elif defined(_AIX)
#include
#else
#endif
#ifdef _xlC
#include
#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;
}


in

首页 上一页 1 2 3 4 5 6 下一页 尾页 1/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++面试题-链表栈二叉树数据结构 下一篇单独编译Android源代码中的模块

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C语言中如何将结构体 (2025-12-24 22:20:09)
·纯C语言结构体成员变 (2025-12-24 22:20:06)
·C语言中,指针函数和 (2025-12-24 22:20:03)
·哈希表 - 菜鸟教程 (2025-12-24 20:18:55)
·MySQL存储引擎InnoDB (2025-12-24 20:18:53)