Andy Niu �����ĵ�

Andy Niu

Andy Niu Help  1.0.0.0
String有关

变量

 string的常用方法
 
 string中的特殊字符
 

详细描述

变量说明

string中的特殊字符
1、考虑如下的代码:
    #include <stdio.h>
    #include <string>
    using std::string;
    
    int main(int argc, char* argv[])
    {
        string aa = "abcde";
        aa[2] = 0;
        string bb(aa.c_str());
        string cc(aa.c_str(), aa.size());
    
        printf("aa size[%d] value[%s]\n", aa.size(), aa.c_str());
        printf("bb size[%d] value[%s]\n", bb.size(), bb.c_str());
        printf("cc size[%d] value[%s]\n", cc.size(), cc.c_str());
    
        return 0;
    }
2、输出结果为:
    aa size[5] value[ab]
    bb size[2] value[ab]
    cc size[5] value[ab]
3、得出结论:
    a、string中可以包含取值为0的字符,甚至可以是任意char类型的字符,其中很多是不可见的字符。
    b、这里和预期不一致,关键的问题是,对于c_str()方法,仅仅返回一个char指针,没有其他的信息
    c、在处理c_str()的时候,由于不知道处理的长度,只能是遇到\0结束,比如 string bb(aa.c_str()); 和 printf
        而string cc(aa.c_str(), aa.size()); 能够正确处理,原因是后面给了长度信息。
    d、也就是说,使用char*构造string的时候,要特别注意,如果预期遇到\0结束,没有问题。如果预期包含\0,必须带上长度信息。
参见
string的常用方法
#include <algorithm>

// 是否匹配前缀
bool IsMatchPrefix(const string& str,const string& prefix)
{
    return strncmp(str.c_str(),prefix.c_str(),prefix.size()) == 0;
}

// 是否包含字符串
bool IsContainsSubStr(const string& str,const string& subStr)
{
    return str.find(subStr,0) != string::npos;
}

// 用bbb替换aaa
void StringReplace(string& str,const string& aaa,const string& bbb)
{
    size_t pos = 0;
    size_t aSize = aaa.size();
    size_t bSize = bbb.size();

    while((pos = str.find(aaa,pos)) != string::npos)
    {
        str.replace(pos,aSize,bbb);
        pos+=bSize;
    }
}

// 使用delim作为分隔符
void StringSplit(const string& str,const string& delim,vector<string>& strVec,bool isRemoveEmpty)
{
    size_t begin = 0;
    size_t end = str.find(delim,begin);

    while(end!=string::npos)
    {
        strVec.push_back(str.substr(begin,end-begin));
        begin = end+strlen(delim.c_str());
        end = str.find(delim,begin);
    }

    if(end>begin)
    {
        strVec.push_back(str.substr(begin,end-begin));
    }

    if(isRemoveEmpty)
    {
        strVec.erase(remove(strVec.begin(),strVec.end(),""),strVec.end());
    }
}

// 删除最后一个元素
// 注意:对于vector和list,删除最后一个元素,只能使用
// erase(迭代器) 和 resize(size-1)
void RemoveLastElement(string& str)
{
    if(str.size() == 0)
    {
        return;
    }

    //str = str.substr(0,str.size()-1);
    //str.erase(str.size()-1);
    //str.erase(--str.end());
    str.resize(str.size()-1);
    // 使最后一个字符无效,达到删除最后一个字符的目的
    // 但是这种方式有问题,因为src的size没有变化
    //str[str.size()-1]=0;
}
Copyright (c) 2015~2016, Andy Niu @All rights reserved. By Andy Niu Edit.