设为首页 加入收藏

TOP

标准C++实现字符串类CString(二)
2014-11-24 03:17:21 来源: 作者: 【 】 浏览:2
Tags:标准 实现 字符串 CString
t CString::IsEmpty(void) const
{
return !m_nLength;
}


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

if (iBufferNum <= 0)
return 0;
AssignNewSpace(m_nSize + iBufferNum * STR_PAGE_SIZE, 1); //分配新的内存空间,变为原来的两倍,移动1倍
return 1;
}


int CString::Append(const char *pSrc, int iLen)
{
int total_len;
char *pNewStart = NULL;

if (iLen <= 0)
return 0;

total_len = m_nLength + iLen; //append后的总的字符串长度

// if some space avaliable, defrag it firstly.
if (m_nSize > total_len) //如果原来总内存空间长度大于append后的字符串长度
{
//如果原来剩余空闲空间小于新添加子字符串的长度,而且
if (m_nSize - (m_pDataEnd - m_pBuffer) < iLen && m_pDataStart - m_pBuffer > 0) //而且m_pDataStart在m_pBuffer的后面
{
Defrag(); //调节原来的字符串
}
}
else //如果原来总内存空间长小于append后的字符串长度,需要开辟新空间
{
// allocate new memory space and copy orignal data
AssignNewSpace(total_len + 1, 1); //分配新的内存空间,变为原来的两倍,移动1倍
}

// get the merge point
pNewStart = m_pDataEnd; //将原来字符串的末尾指针转变成新添加子串的开始指针
if (!pNewStart)
return 0;

// copy data and adjust some pointers
memcpy(pNewStart, pSrc, iLen); //将新添加串pSrc放置在原来串联的末尾
m_nLength = total_len; //字符串的总长度变化
m_pDataStart[m_nLength] = 0; //新的字符串最后以为置为0
m_pDataEnd = &(m_pDataStart[m_nLength]); //让m_pDataEnd指向新的字符串的末尾指针

return 1;
}
void CString::Defrag(void)
{
// Sure! 重新初始化原来字符串头指针m_pDataStart,指向头部
memmove(m_pBuffer, m_pDataStart, m_nLength); //将m_pDataStart复制给m_pBuffer
// adjust those related pointers
m_pDataStart = m_pBuffer; //m_pDataStart指向m_pBuffer
m_pDataStart[m_nLength] = 0;
m_pDataEnd = &(m_pDataStart[m_nLength]); //重新获得原来的字符串尾指针m_pDataEnd
}

// Append another CString to this one

int CString::Append(CString *pNewStr)
{
char *pNewStart = NULL, *pSrc = NULL, *pDest = NULL;

int len = pNewStr->GetLength(); //新添加子串的长度
int total_len;

if (len <= 0)
return 0;

// const char *
pSrc = pNewStr->GetData(); //获得要添加的字符串的头指针
if (!pSrc)
return 0;

total_len = m_nLength + len; //新字符串的总长度 = 原来字符串长度 + 添加字符串长度

// if some space avaliable, defrag it firstly.
if (m_nSize - (m_pDataEnd - m_pBuffer) < len && m_pDataStart - m_pBuffer > 0)
{
Defrag();
}

// allocate new memory space
AssignNewSpace(total_len + 1, 1); // //根据total_len分配新的内存空间
// get the merge point
pNewStart = m_pDataEnd; //将原来字符串的末尾指针转变成新添加子串的开始指针
if (!pNewStart)
return 0;

// copy data and adjust some pointers
memcpy(pNewStart, pSrc, len); //将新添加串pSrc放置在原来串联的末尾
m_nLength = total_len;
m_pDataStart[m_nLength] = 0;
m_pDataEnd = &(m_pDataStart[m_nLength]); //让m_pDataEnd指向新的字符串的末尾指针

return 1;
}

// Adjust start and end pointer of its buffer

// Get one character at give position

char CString::GetAt(int nIndex) const
{
if (nIndex >= m_nLength)
return -1;
if (nIndex < 0)
return -1;

return m_pDataStart[nIndex];
}

// return single character at zero-based index
char CString::operator[](int nIndex) const
{
if (nIndex >= m_nLength)
return -1;

return m_pDataStart[nIndex];
}

// return pointer to const string
CString::operator LPCTSTR() const //将该字符串转变为const char*字符串常量
{
return (const char*)m_pDataStart;
}

// duplicate a string
CString *CString::Duplicate(int iBufferNum) const
{
CString *pCStr = NULL;

pCStr = new CString(m_pDataStart, m_nLength, iBufferNum);

return pCStr;
}

// copy from another CString
const CString& CString::operator=(CString& stringSrc) //赋值操作符
{
long len = stringSrc.GetLength();

首页 上一页 1 2 3 4 5 6 下一页 尾页 2/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)