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

C++ 實作 CString 與 std::string 互轉完整指南

     編輯:關於C++

CString 轉 std::string

在 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();

std::string 轉 CString

反向轉換相對簡單,直接用 c_str() 取得 C 風格字串指標賦值給 CString:

CString strMfc;
std::string strStl = "test";
strMfc = strStl.c_str();

字串分割:突破 AfxExtractSubString 的單字元限制

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 為多字元分隔符。

Unicode 開發良習與常用技巧

1. 善用 _T() 宏

所有字串常數建議包裹在 _T() 中,確保 ANSI/Unicode 版本皆能正確編譯。

2. 格式化字串

CString s;
s.Format(_T("The num is %d."), i);

3. 字串轉整數

  • 十進制:_ttoi()(ANSI 下對應 atoi,Unicode 下對應 _wtoi)
  • 任意進制:_tcstoul() / _tcstol()
CString hex = _T("FAB");
CString dec = _T("4011");
ASSERT(_tcstoul(hex, 0, 16) == _ttoi(dec));

4. 取得 char* 指標

  • 不修改字串:強制轉型 LPCTSTR p = s; 或 (LPCTSTR)s;
  • 需修改/延長字串:使用 GetBuffer() / ReleaseBuffer() 配對。注意:兩者之間不可呼叫該 CString 任何方法,否則物件完整性不受保障。
LPTSTR p = s.GetBuffer();
// 對 p 操作
s.ReleaseBuffer();

5. AfxExtractSubString 使用範例

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
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved