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

VC++ 字串分割利器:CSplitStr 類實現靈活的文本拆分 (支援連續分隔符合併)

     編輯:VC 教學

在處理 CSV 資料、日誌解析、通訊協定拆包等場景中,將字串依指定分隔符拆分為子字串陣列是高頻需求。MFC CString 雖提供基礎操作,但缺乏現成的分割函式。本文提供一個封裝完善的 CSplitStr 類,支援自訂分隔符、可選「連續分隔符視為一個」模式、介面簡潔,極易整合複用。

一、 類別設計

介面定義

class CSplitStr {
private:
    CString m_sSplitFlag;       // 分隔符字串
    BOOL    m_bSequenceAsOne;   // TRUE: 連續分隔符合併為一;FALSE: 產生空字串
    CString m_sData;            // 待分割原始字串

public:
    CSplitStr();                // 預設分隔符 ",", 合併模式
    virtual ~CSplitStr();

    // 核心功能:分割結果存入 CStringArray
    void GetSplitStrArray(CStringArray& array);

    // 屬性存取
    void SetData(CString sData);           CString GetData();
    void SetSplitFlag(CString sFlag);      CString GetSplitFlag();
    void SetSequenceAsOne(BOOL b);         BOOL GetSequenceAsOne();
};

核心演算法 (GetSplitStrArray)

void CSplitStr::GetSplitStrArray(CStringArray& array) {
    CString sData = GetData();
    CString sFlag = GetSplitFlag();

    // 確保結尾有分隔符,簡化迴圈邏輯
    if (sData.Right(1) != sFlag) sData += sFlag;

    CString sToken;
    int nPos = -1;
    while ((nPos = sData.Find(sFlag, 0)) != -1) {
        sToken = sData.Left(nPos); // 取得當前欄位

        if (!GetSequenceAsOne()) {
            array.Add(sToken); // 保留空欄位
        } else {
            // 合併模式:跳過空字串
            if (!sToken.IsEmpty()) array.Add(sToken);
        }

        // 移除已處理部分,繼續下一輪
        sData = sData.Right(sData.GetLength() - nPos - sFlag.GetLength());
    }
}

二、 使用範例

#include  // CStringArray 需要
#include "SplitStr.h"

CSplitStr splitter;
CString src = _T("你好,,歡迎使用文本切分類,作者:江上飛鳥,QQ: 36201365");

splitter.SetSplitFlag(_T(","));       // 中文逗號分隔
splitter.SetSequenceAsOne(TRUE);       // 合併連續分隔符
splitter.SetData(src);

CStringArray arr;
splitter.GetSplitStrArray(arr);

// 結果:
// arr[0] = "你好"
// arr[1] = "歡迎使用文本切分類"
// arr[2] = "作者:江上飛鳥"
// arr[3] = "QQ: 36201365"
// (中間的雙逗號未產生空元素)

三、 設計亮點

  • 封裝性好: 狀態與演算法內聚,不汙染全域命名空間。
  • 彈性配置: 分隔符支援多字元字串 (不限單字元),合併模式可切換。
  • 標準容器: 輸出 CStringArray,無縫對接 MFC 代碼。
  • 邊界處理: 自動補尾部分隔符、TrimLeft/Right 清理首尾空白。

四、 擴展建議

  • 支援正規表示式分隔 (CRegExp / std::regex)。
  • 提供 std::vector<CString> 輸出版本,適配現代 C++。
  • 加入「保留分隔符」選項 (類 Python split(keepends=True))。

這個輕量級工具類已在多個專案中穩定服役,歡迎直接複製 SplitStr.h/.cpp 到專案中使用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved