专业编程基础技术教程

网站首页 > 基础教程 正文

C++ split函数-C++字符串分割函数

ccvgpt 2024-11-11 11:20:50 基础教程 6 ℃

字符串分割,工作中的使用频率也算比较高的,如,将某个字符串按指定字符或者字符串进行分割得到多个子串。

如,读取文件内容按\n或者\r\n进行分割等。

C++ split函数-C++字符串分割函数

然而在C/C++的世界里这些都不是现成的东西,所以这里把我自己项目中用到的提取出来分享给大家。

【虽然可以收藏备用,但是作为C/C++程序员,原理不但要会、自己手写也会才是合格的C/C++程序员哦】

代码示例如下(直接拿去用):

#include <string>
#include <iostream>
#include <vector>

using namespace std;

/**
 * @brief 字符串分割
 *
 * @param str 待分割的字符串
 * @param pattern 分割的标记
 * @return vector<string> 返回分割的结果
 */
vector<string> split(const string &str, const string &pattern) {
  // 匹配的开始下标
  string::size_type pos_si = 0;
  // 匹配的结束下标
  string::size_type pos_ei = 0;
  // 存储所有匹配到的字符串信息
  vector<string> vec;

  // 开始匹配
  string mStr;
  while (true) {
    pos_ei = str.find(pattern, pos_si);
    // 查询不到
    if (pos_ei == string::npos) {
      break;
    }
    // 截取匹配的的内容
    mStr = str.substr(pos_si, pos_ei - pos_si);
    // 收集
    vec.push_back(mStr);
    // 移动到下一个目标位置
    pos_si = pos_ei + pattern.size();
    // 清空子匹配内容
    mStr.clear();
  }
  // 没有全部截完毕
  if (pos_si < str.size()) {
    vec.push_back(str.substr(pos_si));
  }

  return vec;
}

// 测试
int main() {
    // 输入"are you ok ?" 输出 ["are", "you", "ok", "?"]
    vector vec1 = split("are you ok ?", " ");
    for (const auto &v: vec1)
    	cout << v << endl;
    
    // 输入"abc*##efg*##kkkk" 输出 ["abc", "efg", "kkkk)"]
    vector vec2 = split("abc*##efg*##kkkk)", "*##");
    for (const auto &v: vec2)
    	cout << v << endl;
    
    return 0;
}

Tags:

最近发表
标签列表