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);
步骤:

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

上一篇下一篇

猜你喜欢

热点阅读