在 C++ 開發中,經常需要將包含特定分隔符的字符串解析為二維數組結構。例如將 "11<225>22<225>33<225>44<000>aa<225>bb<225>cc<225>dd<000>ee<255>ff<255>hh<000>" 這樣的字符串,按 <...> 格式的分隔符拆分為行,再按內容拆分為列,形成二維數據結構。
< 或 > 時視為分隔點\0,構造指針數組指向各子串起始位置#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,用完需釋放,避免洩漏。CT2A 宏,實際項目中建議用 WideCharToMultiByte 明確指定代碼頁。std::wstring + std::vector<std::wstring> 配合 std::wsregex_token_iterator 實現更安全、無手動內存管理的解析。若需真正的「二維數組」(如 vector<vector<string>>),可在第一層按 <000> 類分隔符切行,第二層按 <225> 類分隔符切列,構建巢狀結構,方便後續業務邏輯按行列索引訪問。