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

VC++ 字串分割函式:支援多字元分隔符與 CAtlArray

     編輯:VC 教學

前言

MFC/ATL 專案常需將字串依指定分隔符切割為子字串陣列。本文提供一個通用 Split 函式,支援任意長度分隔符、使用 CAtlArray<CString> 回傳結果,且不修改原字串。

函式實作

void Split(const CString& content, const CString& pattern,
           CAtlArray<CString>& strList)
{
    int iPos = content.Find(pattern);
    int iStart = 0;

    while (iPos != -1) {
        strList.Add(content.Mid(iStart, iPos - iStart));
        iStart = iPos + pattern.GetLength();
        iPos = content.Find(pattern, iStart);
    }

    // 最後一段
    if (iStart <= content.GetLength()) {
        strList.Add(content.Mid(iStart));
    }
}

使用範例

CAtlArray<CString> parts;
CString src = _T("apple,banana,orange,grape");
Split(src, _T(","), parts);

for (int i = 0; i < parts.GetCount(); ++i) {
    TRACE(_T("Part %d: %s\n"), i, parts[i]);
}
// 輸出:
// Part 0: apple
// Part 1: banana
// Part 2: orange
// Part 3: grape

進階版本:支援空白分隔符、保留空欄位

void SplitEx(const CString& content, const CString& pattern,
             CAtlArray<CString>& strList, bool keepEmpty = false)
{
    if (pattern.IsEmpty()) return; // 避免無限迴圈

    int start = 0;
    while (true) {
        int pos = content.Find(pattern, start);
        if (pos == -1) {
            CString tail = content.Mid(start);
            if (keepEmpty || !tail.IsEmpty()) strList.Add(tail);
            break;
        }
        CString token = content.Mid(start, pos - start);
        if (keepEmpty || !token.IsEmpty()) strList.Add(token);
        start = pos + pattern.GetLength();
    }
}

效能提示

  • CAtlArray 為 ATL 輕量陣列,無 MFC 執行期相依,適合 DLL 介面。
  • 若分割極長字串(>10MB),建議改用 CStringA/std::string 並預先 reserve 容量。
  • 分隔符為單一字元時,CString::Tokenize (MFC 8.0+) 更簡潔。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved