美文网首页
40_字符串的创建

40_字符串的创建

作者: 编程半岛 | 来源:发表于2018-07-14 13:01 被阅读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

    相关文章

      网友评论

          本文标题:40_字符串的创建

          本文链接:https://www.haomeiwen.com/subject/lmispftx.html