首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ 字符串轉二維數組實戰:以特定分隔符解析為矩陣結構

     編輯:程式設計疑難解答

問題背景

在 C++ 開發中,經常需要將包含特定分隔符的字符串解析為二維數組結構。例如將 "11<225>22<225>33<225>44<000>aa<225>bb<225>cc<225>dd<000>ee<255>ff<255>hh<000>" 這樣的字符串,按 <...> 格式的分隔符拆分為行,再按內容拆分為列,形成二維數據結構。

核心思路

  1. 將 CString 轉換為 C 風格字符串緩衝區
  2. 掃描字符串,遇到 < 或 > 時視為分隔點
  3. 在分隔點插入結束符 \0,構造指針數組指向各子串起始位置
  4. 最終得到字符串指針數組,可按行列訪問

完整代碼示例

#include <afxwin.h>
#include <iostream>
#include <cstring>

int main() {
    CString aa = _T("11<225>22<225>33<225>44<000>aa<225>bb<225>cc<225>dd<000>ee<255>ff<255>hh<000>");
    
    // 複製到可修改的緩衝區
    int len = aa.GetLength();
    char* buffer = new char[len + 1];
    strcpy_s(buffer, len + 1, CT2A(aa)); // 需要 ATL 支持或用 WideCharToMultiByte
    
    // 指針數組,最多 len 個片段
    char** arr = new char*[len];
    int n = 1;
    arr[0] = buffer;
    
    for (int i = 0; i < len; ++i) {
        if (buffer[i] == '<' || buffer[i] == '>') {
            buffer[i] = '\0';           // 截斷當前片段
            if (i + 1 < len) {
                arr[n++] = &buffer[i + 1]; // 記錄下一片段起始
            }
        }
    }
    
    // 輸出所有片段(每行一個)
    for (int i = 0; i < n; ++i) {
        std::cout << arr[i] << std::endl;
    }
    
    delete[] buffer;
    delete[] arr;
    return 0;
}

關鍵點解析

  • 內存管理:手動分配 buffer 和 arr,用完需釋放,避免洩漏。
  • 編碼轉換:CString (Unicode) 轉 char* 需正確處理,示例用 CT2A 宏,實際項目中建議用 WideCharToMultiByte 明確指定代碼頁。
  • 邊界情況:連續分隔符、首尾分隔符會產生空串,業務邏輯需自行過濾。
  • 現代化替代:C++11 起可用 std::wstring + std::vector<std::wstring> 配合 std::wsregex_token_iterator 實現更安全、無手動內存管理的解析。

進階建議

若需真正的「二維數組」(如 vector<vector<string>>),可在第一層按 <000> 類分隔符切行,第二層按 <225> 類分隔符切列,構建巢狀結構,方便後續業務邏輯按行列索引訪問。

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