stl下string 一些类似MFC中CString的函数

class cstr
{
public:
    static void to_lower(char *str)
    {
        int   i = 0;
        while(str[i] != '\0')
        {
            if((str[i] >= 'A') && (str[i] <= 'Z'))
            {
                str[i] += 32;
            }
            ++i;
        }
    }

    static void to_upper(char *str)
    {
        int  i = 0;
        while(str[i] != '\0')
        {
            if((str[i] >= 'a') && (str[i] <= 'z'))
            {
                str[i] -= 32;
            }
            ++i;
        }
    }
    static void to_upper(std::string& str)
    {
        for (std::string::iterator it=str.begin(); it!=str.end(); ++it)        
        {
            if((*it >= 'a') && (*it <= 'z'))
            {
                *it -= 32;
            }            
        }
    }
    static void to_lower(std::string& str)
    {
        for (std::string::iterator it=str.begin(); it!=str.end(); ++it)        
        {
            if((*it >= 'A') && (*it <= 'Z'))
            {
                *it += 32;
            }            
        }
    }
/*
    static std::string to_upper(char *str)
    {
        int  i = 0;
        while(str[i] != '\0')
        {
            if((str[i] >= 'a') && (str[i] <= 'z'))
            {
                str[i] -= 32;
            }
            ++i;
        }
        return str;
    }
*/
    //字符串格式化函数
    static std::string format(const char *fmt, ...)
    {
        if (NULL == fmt)
        {
            return "";
        }
        std::string strResult = "";
        va_list marker = NULL;
        va_start(marker, fmt);                                //初始化变量参数
        size_t nLength = 1024*8+1;                            //获取格式化字符串长度
        std::vector<char> vBuffer(nLength, '\0');            //创建用于存储格式化字符串的字符数组
        MARK:int nWritten = _vsnprintf(&vBuffer[0], vBuffer.size(), fmt, marker);
        //当nwritten不小于0时返回的格式化到vbuffer中的数据长度,当小于0时说明出错,等于-1时说明长度不够,此时将重新分配空间,然后再做格式化
        if (nWritten >= 0)
        {
            strResult = &vBuffer[0];
        }
        //vbuffer长度不够,扩展nlength/2的长度
        else if (-1 == nWritten)
        {
            vBuffer.erase(vBuffer.begin(), vBuffer.end());
            nLength += nLength;
            vBuffer.resize(nLength, '\0');
            //最多分配1G的空间,超过1G将不再处理
            if (nLength < 1024*1024*1024)
            {
                goto MARK;
            }
        }
        va_end(marker);                                    //重置变量参数
        return strResult;
    }

    //字符串格式化函数
    static std::string format_s(size_t maxsize, const char *fmt, ...)
    {
        if (NULL == fmt)
        {
            return "";
        }
        std::string strResult = "";
        va_list marker = NULL;
        va_start(marker, fmt);                                //初始化变量参数
        size_t nLength = maxsize+1;                            //获取格式化字符串长度
        std::vector<char> vBuffer(nLength, '\0');            //创建用于存储格式化字符串的字符数组
        int nWritten = _vsnprintf(&vBuffer[0], vBuffer.size(), fmt, marker);
        //当nwritten不小于0时返回的格式化到vbuffer中的数据长度,当小于0时说明出错,此时返回空字符串
        if (nWritten > 0)
        {
            strResult = &vBuffer[0];
        }
        va_end(marker);                                    //重置变量参数
        return strResult;
    }

    static std::string left(const std::string& str, int nCount)
    {
        std::string s = str;
        int nSize = s.size();
        nCount<0?nCount=0:nCount;
        nCount>nSize?nCount=nSize:nCount;
        if (0 == nCount && 0 == nSize)
        {
            s = "";
        }
        else
        {
            s.erase(MIN2(nCount, nSize), nSize);
        }
        return s;
    }
    static std::string right(const std::string& str, int nCount)
    {
        std::string s = str;
        nCount<0?nCount=0:nCount;
        int nSize = s.size();
        int nLen  = nSize-nCount;
        if (nLen > 0)
        {
            s.erase(0, nLen);
        }
        return s;
    }
    static void replace(std::string& str, const char* szOld, const char* szNew)
    {
        if (NULL != szNew && NULL != szOld)
        {
            int nOldLen = strlen(szOld);
            int nNewLen = strlen(szNew);
            bool bEqual = ((nNewLen == nOldLen) && 0 == memcmp(szOld, szNew, nOldLen));
            //szOld不为空字符串且szOld和szNew不相同
            if (nOldLen > 0 && !bEqual)
            {
                size_t found = str.find(szOld);
                while (found != std::string::npos)
                {
                    str.replace(found, nOldLen, szNew);
                    found += nNewLen;
                    found = str.find(szOld, found);
                }
            }
        }
    }
    //去右空格
    static void trimright(std::string& str, const char* szTargets=NULL)
    {
        int nLen = str.size();
        int nTargetsLen = 0;
        //默认只去空格
        if (NULL == szTargets || (0 == strlen(szTargets)))
        {
            if (nLen > 0)
            {
                while (nLen > 0)
                {
                    if (str[nLen - 1] != 32)
                    {
                        break;
                    }
                    else
                    {
                        --nLen;
                        str.erase(nLen, 1);
                    }
                }
            }
        }
        else
        {
            nTargetsLen = strlen(szTargets);
            if (nLen > 0)
            {
                int i = 0;
                while (nLen > 0)
                {
                    if (str[nLen - 1] != szTargets[nTargetsLen - i - 1])
                    {
                        break;
                    }
                    else
                    {
                        ++i;
                        --nLen;
                    }
                    if (i == nTargetsLen)
                    {
                        str.erase(nLen, nTargetsLen);
                        i = 0;
                        nLen = str.size();
                    }
                }
            }
        }
    }
    //去左空格
    static void trimleft(std::string& str, const char* szTargets=NULL)
    {
        if (!szTargets || '\0'==szTargets[0] ||  '\0'==szTargets[1])
        {
            const char ch =  (!szTargets || '\0'==szTargets[0])?' ':szTargets[0];
            std::string::iterator it;
            for (it=str.begin(); it!=str.end(); ++it)
            {
                if (ch != *it)
                    break;
            }
            if (it != str.begin())
            {
                str.erase(str.begin(), it);
            }
        }
        else
        {
            const size_t nLen = strlen(szTargets);
            const size_t nStrLen = str.size();
            size_t nPos = 0;
            while ((nPos + nLen) <= nStrLen)
            {
                if (0 != memcmp(str.data()+nPos, szTargets, nLen))
                {
                    break;
                }
                nPos += nLen;
            }
            if (nPos > 0)
            {
                str.erase(0, nPos);
            }
        }
    }
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值