string 实现字符串分割

都说C++处理字符串,文本很乏力,有了STL还是方便很多;不熟悉的还得现查,知识还是得多积累,多分享,先从记录一个字符串分隔开始

  1. string初始化
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()); 
  1. find函数
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;
  1. Algorithm count
/* 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);
  }

}

参考文献:

  1. C++ string 用法详解,作者:Nicolai M.Josuttis

你可能感兴趣的:(C/C++,string,字符串分割)