都说C++处理字符串,文本很乏力,有了STL还是方便很多;不熟悉的还得现查,知识还是得多积累,多分享,先从记录一个字符串分隔开始
string str("kevin is a handsome boy~");
// str1初始化为 从str的下标0开始,往后5个单位的子串
string str1(str, 0, 5); // str1 = kevin
// str2初始化为 从str的下标2开始,往后5个单位的子串
string str2(str, 2, 5); // str2 = vin i
// str3 从str的下标2开始,往后str.size个单位的子串. 这肯定是超过str的范围了,
但是这个STL还是有保护处理,str3只是复制到下标2开始,到str字符串末尾
位置;这是用使用不建议这么使用,毕竟是越界访问,一定注意此函数迭代器
的构造函数区别
string str3(str, 2, str.size());
// str4 初始化为 从str的下标2开始,直到字符串末尾
string str4(str,2);
char cstr[40] = "life is short,you need python!";
string str5(cstr); // 将C字符串作为s的初值
string str6(cstr, 10); // 将C字符串前chars_len个字符作为字符串s的初值。这个注意和str4进行区分
// string s(num, c); // 生成一个字符串,包含num个c字符
string str7(8, '8');
// string s(beg, end) //str8 以迭代器区间beg;end(不包含end)内的字符作为字符串s的初值
string str8(str.begin(), str.end());
string::size_type Pos1 = str.find('i'); // npos = 3, 从下标0开始查找,str返回第一次出现i的位置
string::size_type Pos2 = str.find('i', 4) // npos = 6, 从下标3(第四个位置)开始查找,返回第一次出现i的位置
Pos1 Pos2 最好使用string::size_type定义,而不是int,或者unsigned, 因为如果找不到,会返回string::npos ;这个值一般是-1,为了避免引起异常,找到的结果和它进行比较,来确认是否找到;
其实string::npos表示的是-1, 看看头文件:
template
const basic_string<_CharT,_Traits,_Alloc>::size_type
basic_string<_CharT,_Traits,_Alloc>::npos
= basic_string<_CharT,_Traits,_Alloc>::size_type) -1;
/* template< class InputIt, class T >
typename iterator_traits::difference_type
count( InputIt first, InputIt last, const T &value ); */
count(str.begin, str.end, 'd'); //统计str 从begin到end,出现d字符的个数
4.更改字符串内容
这在字符串的操作中占了很大一部分。 首先讲赋值,第一个赋值方法当然是使用操作符=,新值可以是string(如:s=ns) 、c_string(如:s=”gaint”)甚至单一字符(如:s=’j’)。还可以使用成员函数assign(),这个成员函数可以使你更灵活的对字符串赋值。
string str("C++ is the best language of the world~");
string s;
s.assign(str); // 直接str 整个拷贝给s
s.assign(str, 1, 4); // 从下标1开始,赋值到下标3 [1,3] 闭区间 s = "++ i"
s.assign(str, 2, string::npos); // 把字符串str从索引值2开始到结尾赋给s
s.assign("gaint"); // 直接拷贝“gaint”
s.assign("nico", 5); // 把’n’ ‘I’ ‘c’ ‘o’ ‘\0’赋给字符串
s.assign(5, 'x'); // 把五个x赋给字符串
以上的知识点就够了,然后实现如下:
#include
#include
#include
using namespace std;
void GetSeparateInfo(const string SourceStr, char cFlag, vector &VectStrRes);
int main() {
string SourceStr("windows,linux,github");
char cFlag = ',';
string key;
vector VectStrRes;
GetSeparateInfo(SourceStr, cFlag, VectStrRes);
return 0;
}
/************************************************************************/
/* 在一串字符中根据分隔符的位置提取相应内容 保存在vector中
/************************************************************************/
void GetSeparateInfo(const string SourceStr, char cFlag, vector &VectStrRes) {
string key;
string::size_type nBeginPos = 0;
string::size_type nEndPos = 0;
int nNum = count(SourceStr.begin(), SourceStr.end(), cFlag);
for (int i = 0; i <= nNum; i++) {
key.clear();
// 每次从分隔符的下个位置直到SourceStr的末尾 拷贝成子串,
string SourceStrCopy(SourceStr, nBeginPos);
nEndPos = SourceStrCopy.find(cFlag);
if (string::npos != nEndPos) {
// 从SourceStr 的下标nBeginPos开始,直到下标nEndPos,赋值给key
key.assign(SourceStr, nBeginPos, nEndPos);
nBeginPos += nEndPos + 1;
std::cout << key.c_str() << std::endl;
} else if (i == nNum) {
// 已经找完的所有分隔符,剩余最后一个分隔符和行尾的子串
key = SourceStrCopy;
std::cout << key.c_str() << std::endl;
} else {
std::cout << "没有分隔符" << endl;
}
VectStrRes.push_back(key);
}
}
参考文献: