在處理 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();
};
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++。split(keepends=True))。這個輕量級工具類已在多個專案中穩定服役,歡迎直接複製 SplitStr.h/.cpp 到專案中使用。