string通用函數

這篇博文一個月前就想寫了,但是拖到現在纔有時間。
起因是要做一個公司的項目,這個項目是用MFC寫的,其實底層實現大多數都是用的標準庫,但是讓我比較尷尬的是我不會MFC,於是就想把界面和底層剝離,用QT來設計界面。
別的還好說,最蛋疼的就是這個項目裏用大量的CString變量以及相關函數,沒辦法我就替換這些函數,這就是背景,廢話少說,直接上代碼:

//聲明
namespace CStirng2String
{
    //轉大寫   
    void strupper(string& str);                 

    //轉小寫   
    void strlower(string& str);

    //從最高位起去除空格,直至第一個非空格爲止                  
    void TrimRight(string& str);

    //從最高位起去除指定字符串中的任意元素,直至第一個非子元素爲止
    void TrimRight(string& str, const char* c);  

    //從最低位起去除空格,直至第一個非空格爲止                  
    void TrimLeft(string& str);                 

    //從最高位起去除指定字符串中的任意元素,直至第一個非子元素爲止
    void TrimLeft(string& str, const char* c);

    //去掉字符串裏某個字符,注意,是都去掉    
    int DeleteChar(string& str,char ch = ' ');      

    //字符串以某段開頭
    bool StartWith(const string& str,const string& strStart);       

    //字符串以某段結尾
    bool EndWith(const string& str,const string& strEnd);   

    //字符串替換     
    void replace_all(string& str, string _old, string _new); 

     //截取低n位
    string left(string src, unsigned int _offset);

    //截取高n位
    string right(string src, size_t _offset); 

    //去除從nIndex下標開始的nCount位
    int remove(string& str, size_t nIndex = 0, size_t nCount = 1);

    //在指定nIndex下標插入子字符串
    int insert(string& str, size_t nIndex, string& sub);
    int insert(string& str, size_t nIndex, const char* sub);

    //類似sprintf
    int format(string& str, const char* format_str, ...);

    //從最低位開始找到第一個屬於指定字符串集合的元素位置
    int findOneOf(string str, const char* c);

    //類似於strncmp
    string SpanIncluding(string &str, const char* sub);

    //複製
    int copy(string& des, string src);
};
#include "stdafx.h"
#include <crtdbg.h>
#include<stdio.h>
#include<stdarg.h>
#include <algorithm>

#include "generalfuns.h"

void string_genral::strupper(string& str)
{
    transform(str.begin(),str.end(),str.begin(),::toupper);
}

void string_genral::strlower(string& str)
{
    transform(str.begin(),str.end(),str.begin(),::tolower);
}

void string_genral::TrimLeft(string& str)
{
    str.erase(0,str.find_first_not_of(' '));
}

void string_genral::TrimRight(string& str)
{
    str.erase(str.find_last_not_of(' ')+1);
}

void string_genral::TrimLeft(string& str, const char* c)
{
    char ch[2] = {0};
    string::iterator iter;

    if (c == NULL)
    {
        return;
    }
    else
    {
        while(str.size())
        {
            iter = str.begin();
            ch[0] = str.at(0);

            if (NULL == strstr(c, ch))
            {
                break;
            }

            str.erase(iter);
        }
    }

    return;
}

void string_genral::TrimRight(string& str, const char* c)
{
    char ch[2] = {0};
    string::iterator iter;

    if (c == NULL)
    {
        return;
    }
    else
    {
        while(str.size())
        {
            iter = str.end() - 1;
            ch[0] = str.at(str.size() - 1);

            if (NULL == strstr(c, ch))
            {
                break;
            }

            str.erase(iter);
        }
    }

    return;
}

int string_genral::DeleteChar(string& str,char ch)
{
    int o_size = str.size();
    str.erase(remove_if(str.begin(),str.end(),bind2nd(equal_to<char>(), ch)),str.end());

    return (o_size - str.size());
}


bool string_genral::StartWith(const string& str,const string& strStart)
{
    if(str.empty() || strStart.empty())
    {
        return false;
    }

    return str.compare(0,strStart.size(),strStart)==0?true:false;
}

bool string_genral::EndWith(const string& str,const string& strEnd)
{
    if(str.empty() || strEnd.empty())
    {
        return false;
    }
    return str.compare(str.size()-strEnd.size(),strEnd.size(),strEnd)==0?true:false;
}

void string_genral::replace_all(string& str, string _old, string _new)
{
    if (str.find(_old) == -1)
    {
        return;
    }

    str.replace(str.find(_old), _old.size(), _new);

    return replace_all(str, _old, _new);
}

string string_genral::left(string src, unsigned int _offset)
{
    string dst("\0");
    string::iterator iter = src.begin();
    if (src.size() < _offset)
    {
        _offset = src.size();
        //return dst;
    }

    iter += _offset;

    dst.append(src.begin(), iter);
    return dst;
}

string string_genral::right(string src, size_t _offset)
{
    string::iterator iter;
    string rst("\0");

    if (_offset < 1 || _offset > src.size())
    {
        return rst;
    }

    iter = src.end() - _offset;
    rst.append(iter, src.end());

    return rst;
}

//已驗證
int string_genral::remove(string& str, size_t nIndex, size_t nCount /* = 1 */)
{
    string temp;
    string::iterator iter;

    if (nIndex>= 0 
        && nCount >=0 
        && (nCount + nIndex <= str.size()))
    {
        //temp = str.substr(nIndex, nCount);
        while(nCount)
        {
            iter = str.begin();
            advance(iter, nIndex);  // + nIndex;
            str.erase(iter);
            //iter++;
            nCount--;
            //printf("%d", nCount);
        }

        return str.size() - nCount;
    }


    return -1;
}

//已驗證
int string_genral::insert(string& str, size_t nIndex, string& sub)
{
    string::iterator iter;

    if (nIndex < 0 )
    {
        return -1;
    }

    for (int i = 0; i< sub.size() ; i++)
    {
        iter = str.begin() + nIndex;
        str.insert(iter, sub.at(i));
        nIndex++;
    }

    return str.size();
}

int string_genral::insert(string& str, size_t nIndex, const char* sub)
{
    string::iterator iter;

    if (nIndex < 0 )
    {
        return -1;
    }


    for (int i = 0; i < strlen(sub); i++)
    {
        iter = str.begin() + nIndex;
        str.insert(iter, sub[i]);
        nIndex++;
    }

    return str.size();
}

//已驗證
int string_genral::format(string& str, const char* format_str, ...)
{
    int rst = 0;
    char _c[2048] = {0};
    va_list _arglist;
    va_start(_arglist, format_str);
    rst = vsprintf(_c, format_str, _arglist);
    va_end(_arglist);
    str = _c;

    return rst;
}

int string_genral::findOneOf(string str, const char* c)
{
    char ch[2] = {0};
    string::iterator iter;

    if (c == NULL)
    {
        return string::npos;
    }

    iter = str.begin();

    for(int i = 0; i < str.size() ;i++)
    {
        ch[0] = str.at(i);

        if (NULL != strstr(c, ch))
        {
            return i;
        }
    }

    return string::npos;
}

//已驗證
string string_genral::SpanIncluding(string &str, const char* sub)
{
    char _c[2] = {0};
    string rslt("\0");

    for(int i = 0; i<str.size() ;i++)
    {
        _c[0] = str.at(i);
        if (strstr(sub, _c) != NULL)
        {
            rslt.push_back(_c[0]);
        }
    }

    return rslt;
}

int string_genral::copy(string& des, string src)
{
    int reslt = src.size();

    des.assign(src.begin(), src.end());

    return reslt;
}

//已驗證
int ListGet(list<int> _list, size_t nIndex)
{
    int rslt;
    memset(&rslt, 0,sizeof(int));
    list<int>::iterator iter;

    if (_list.size() < (nIndex + 1))
    {
        return rslt;
    }

    iter = _list.begin();
    advance(iter, nIndex);
    rslt = *iter;
    return rslt;
}
發佈了30 篇原創文章 · 獲贊 19 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章