1、string 字符串截取

(1)、string类型

用substr(pos, n)(注:pos代表位置, n代表截取几个)截取子串,若字符串全是英文,得到的结果与预期的一致。若字符串中含有中文,因一个英文字符串长度为1、中文的字符串长度为2(根据编码决定),运行结果则与预期的不一致。

用以下函数进行转换即可达到预期效果

//判断字符是否是中文
int is_zh_ch(char p){
    if(~(p >> 8) == 0)
    {
        return 1;
    }
    return -1;
}
string sub(string str,int start,int end){  // start需从1开始
    if(typeid(str)==typeid(string) && str.length()>0){
        int len=str.length();
        string tmp="";
        vector <string> dump;
        int i=0;
        while(i<len)
        {
            if (is_zh_ch(str.at(i))==1)
            {
                dump.push_back(str.substr(i,2));
                i=i+2;
            }else{
                dump.push_back(str.substr(i,1));
                i=i+1;
            }
        }
        end=end>0?end:dump.size();
        if(start<0||start>end){
            printf("方法调用错误,第一个参数应该大于等于0且小于第二个参数!\n");
        }
        for(int i=start; i<=end; i++)
        {
            tmp+=dump[i-1];
        }
        return tmp;
    }
    else
    {
        printf("请输入字符串!\n");
        return "";
    }
}

(2)、wstring

wstring类型直接用substr(pos, n)函数即可。

std::wstring wstr111 = L"/2/测试/子测试/夫低";
std::wstring wstr222 = wstr111.substr(0, 8);
wcout.imbue(locale("chs"));
wcout << wstr222.c_str() << endl;

wstring输出可用wcout,输出前需要设置wcout.imbue(locale("chs"));

c_str()(个人理解是c语言的string),生成一个const char*指针,指向以空字符终止的数组。 内容与原string串相同. 这是为了与c语言兼容。