在 MFC 專案中,常需將 CString 轉為標準庫 std::string。最直接的方式是使用 GetBuffer() 取得內部緩衝區指標:
CString strMfc = _T("test");
std::string strStl = strMfc.GetBuffer(0);
strMfc.ReleaseBuffer();
Unicode 環境下 需額外處理:先轉為 CStringA 再取得緩衝區:
CStringW strw = _T("test");
CStringA stra(strw.GetBuffer(0));
strw.ReleaseBuffer();
std::string imgpath = stra.GetBuffer(0);
stra.ReleaseBuffer();
反向轉換相對簡單,直接用 c_str() 取得 C 風格字串指標賦值給 CString:
CString strMfc; std::string strStl = "test"; strMfc = strStl.c_str();
AfxExtractSubString 僅支援單一字元做分隔符,實務上常需多字元分隔。自行實作 Split 函式利用 CString::Find 即可:
void Split(CString source, CStringArray& dest, CString delimiter) {
dest.RemoveAll();
int pos = 0, pre_pos = 0;
while (-1 != pos) {
pre_pos = pos;
pos = source.Find(delimiter, pos + 1);
dest.Add(source.Mid(pre_pos, pos - pre_pos));
}
}
參數說明:source 為原始字串,dest 為輸出陣列,delimiter 為多字元分隔符。
所有字串常數建議包裹在 _T() 中,確保 ANSI/Unicode 版本皆能正確編譯。
CString s;
s.Format(_T("The num is %d."), i);
_ttoi()(ANSI 下對應 atoi,Unicode 下對應 _wtoi)_tcstoul() / _tcstol()CString hex = _T("FAB");
CString dec = _T("4011");
ASSERT(_tcstoul(hex, 0, 16) == _ttoi(dec));
LPCTSTR p = s; 或 (LPCTSTR)s;GetBuffer() / ReleaseBuffer() 配對。注意:兩者之間不可呼叫該 CString 任何方法,否則物件完整性不受保障。LPTSTR p = s.GetBuffer(); // 對 p 操作 s.ReleaseBuffer();
CString csFullString(_T("abcd-efg-hijk-lmn"));
CString csTemp;
AfxExtractSubString(csTemp, (LPCTSTR)csFullString, 0, '-'); // abcd
AfxExtractSubString(csTemp, (LPCTSTR)csFullString, 1, '-'); // efg
// 分隔符可任意指定單一字元
AfxExtractSubString(csTemp, (LPCTSTR)csFullString, 0, 'f'); // abcd-e