首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C++ 實現 string 分割函數:單字符分隔符版 split 通用代碼片段

     編輯:關於C語言

需求場景

C++ 標準庫無內建 split,常需將 "aa*bb*cc" 按 '*' 分割為 vector<string>{"aa","bb","cc"}。

核心實現

vector<string> split(const string& s, char delim) {
    vector<string> res;
    size_t last = 0, pos = s.find(delim, last);
    while (pos != string::npos) {
        res.push_back(s.substr(last, pos - last));
        last = pos + 1;
        pos = s.find(delim, last);
    }
    if (last < s.size()) // 最後一段
        res.push_back(s.substr(last));
    return res;
}

完整可運行測試

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main() {
    string str = "abc*123*xyz";
    auto parts = split(str, '*');
    for (auto& p : parts) cout << p << endl;
    // 輸出: abc  123  xyz
    return 0;
}

擴展:多字符分隔符 / 正則版

// 多字符分隔符(任一字符作為分隔)
vector<string> split_multi(const string& s, const string& delims) {
    vector<string> res;
    size_t last = 0, pos = s.find_first_of(delims, last);
    while (pos != string::npos) {
        if (pos > last) res.push_back(s.substr(last, pos - last));
        last = pos + 1;
        pos = s.find_first_of(delims, last);
    }
    if (last < s.size()) res.push_back(s.substr(last));
    return res;
}

// C++17 string_view 零拷貝版(高性能)
vector<string_view> split_view(string_view s, char delim) {
    vector<string_view> res;
    size_t pos = 0;
    while ((pos = s.find(delim)) != string_view::npos) {
        res.push_back(s.substr(0, pos));
        s.remove_prefix(pos + 1);
    }
    if (!s.empty()) res.push_back(s);
    return res;
}

避坑提示

  • 連續分隔符會產生空串,按需決定是否保留。
  • 字符串以分隔符結尾時,last == size(),不再額外 push。
  • 大數據量優先用 string_view 避免拷貝。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved