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且小于第二个参数! "); } for(int i=start; i<=end; i++) { tmp+=dump[i-1]; } return tmp; } else { printf("请输入字符串! "); 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语言兼容。
2、类型转化
(1)、string类型转换为wstring
std::wstring StringToWstring(const std::string str){ unsigned len = str.size() * 2; setlocale(LC_CTYPE, ""); wchar_t *p = new wchar_t[len]; mbstowcs(p,str.c_str(),len); std::wstring wstr(p); delete[] p; return wstr; }
(2)、wstring转换为string
std::string WstringToString(LPCWSTR pwszSrc) { std::string strTemp; int nLen = WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, NULL, 0, NULL, NULL); if (nLen <= 0) { return strTemp; } char* pszDst = new char[nLen]; pszDst[0] = '