40_字符串的创建
2018-07-14 本文已影响4人
编程半岛
关键词:字符串类中的常用成员函数:重载数组访问操作符、判断是否以指定字符串开始或结束、在指定位置插入字符串、去掉字符串两端的空白字符
0. 字符串类中的常用成员函数
成员函数 | 功能描述 |
---|---|
opeartor [] (i) | 操作符重载函数,访问指定下标的字符 |
startWith(s) | 判读字符串是否以s开头 |
endOf(s) | 判读字符串是否以s结尾 |
insert(i, s) | 在字符串的位置i处插入s |
trim() | 去掉字符串两端空白 |
1. 重载数组访问操作符
char& operator[] (int i)
char operator[] (int i) const
注意事项:
当i的取值不合法时,抛出异常。
char& String::operator[](int i)
{
if( (i >= 0) && (i < m_length) )
{
return m_str[i];
}
else
{
THROW_EXCEPTION(IndexOutOfBoundsException, "Parameter i is invalid ...");
}
}
char String::operator [](int i) const
{
return (const_cast<String&>(*this))[i];
}
2. 判断是否以指定字符串开始或结束
bool startWith(const char* s) const;
bool startWith(const String& s) const;
bool endOf(const char* s) const;
bool endOf(const String& s) const;
bool equal(const char* l, const char* r, int len) const;
bool String::equal(const char* l, const char* r, int len) const
{
bool ret = true;
for(int i=0; (i<len) && ret; ++i)
{
ret = ret && (l[i] == r[i]);
}
return ret;
}
bool String::startWith(const char* s) const
{
bool ret = (s != NULL);
if( ret )
{
int len = strlen(s);
ret = (len < m_length) && (equal(m_str, s, len));
}
return ret;
}
bool String::startWith(const String& s) const
{
return startWith(s.m_str);
}
bool String::endOf(const char* s) const
{
bool ret = (s != NULL);
if( ret )
{
int len = strlen(s);
char* str = m_str + (m_length - len); // 移动起始位置
ret = (len < m_length) && (equal(str, s, len));
}
return ret;
}
bool String::endOf(const String& s) const
{
return endOf(s.m_str);
}
3. 在指定位置处插入字符串
String& insert(int i, const char* s);
String& insert(int i, const String& s);
步骤:
- 申请一片新的内存空间
- 将0~i的数据复制到新的内存空间中;
- 将新插入的数据复制到新的内存空间中;
-
将剩余部分的数据复制到新的内存空间中。
插入字符串原理图
String& String::insert(int i, const char* s)
{
if( (i>=0) && (i<=m_length) ) // 判断i的位置是否合法
{
if( (s != NULL ) && (s[0] != '\0') ) // 判断s不为空指针且不为空字符串
{
int len = strlen(s);
char* str = reinterpret_cast<char*>(malloc(m_length + len + 1));
if( str != NULL )
{
strncpy(str, m_str, i);
strncpy(str+i, s, len);
strncpy(str+i+len, m_str+i, m_length-i);
str[m_length + len] = '\0';
free(m_str);
m_str = str;
m_length = m_length + len;
}
else
{
THROW_EXCEPTION(NoEnoughMemoryExcetion, "No memory to assign a new String value...");
}
}
}
else
{
THROW_EXCEPTION(IndexOutOfBoundsException, "Parameter i is invalid ...");
}
return *this;
}
4. 去掉字符串两端的空白字符
String& trim()
String& String::trim()
{
int b = 0;
int e = m_length - 1;
while( m_str[b] == ' ' ) ++b;
while( m_str[e] == ' ' ) --e;
if( b == 0 )
{
m_str[e + 1] = '\0';
m_length = e + 1;
}
else
{
for(int i=0, j=b; j<=e; ++i, ++j)
{
m_str[i] = m_str[j];
}
m_str[e - b + 1] = '\0';
m_length = e - b + 1;
}
return *this;
}
声明:此文章仅是本人在学习狄泰学院《数据结构实战开发教程》所做的笔记,文章中包含狄泰软件资料内容,一切版权归狄泰软件所有!
实验环境:ubuntu10 + Qt Creator2.4.1 + Qt SDK 4.7.4