C++實現CString和string的互相轉換

CString->std::string 例子: 

CString strMfc=「test「; 

std::string strStl; 

strStl=strMfc.GetBuffer(0);數組

unicode情形下:函數

    CStringW strw = _T("test");
    CStringA stra(strw.GetBuffer(0));
    strw.ReleaseBuffer();編碼

    std::string imgpath=stra.GetBuffer(0);
    stra.ReleaseBuffer();

std::string->CString   例子: 

CString strMfc; 

std::string strStl=「test「; 

strMfc=strStl.c_str(); 
spa

AfxExtractSubString是截取字符串的函數,很好用,不過美中不足的地方在與它只能使用單個字符做爲分割符。指針

可是這種狀況在不少時候都行不通,若是分割符須要是兩個字符以上呢?code

以前由於這個問題試了好久,也在網上搜索過。不過惋惜的是,網上的大部分關於VC截取字符串的文章都是那麼一樣的幾篇,都是寫的滿複雜而後能夠實現了AfxExtractSubString功能而已的,也就是隻能用單個字符截取,可是標題卻寫着用字符串截取字符串,可笑!orm

不找了,本身寫吧。CString裏面有Find,而後再組成數組。對象

void  Split(CString source, CStringArray &  dest, CString division)
{
     dest.RemoveAll();
    
int  pos  =   0 ;
    
int  pre_pos  =   0 ;
    
while - 1   !=  pos ) {
         pre_pos 
=  pos;
         pos 
=  source.Find(division,(pos + 1 ));
         dest.Add(source.Mid(pre_pos,(pos
- pre_pos)));
     }


}

CString source是須要截取的原字符串,ci

CStringArray& dest 是最終結果的數組unicode

CString division 是用來作分割符的字符串

 

備忘:爲了適用於Unicode環境,要養成使用_T()宏的習慣

一、格式化字符串

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

 

二、轉爲 int

轉10進制最好用_ttoi(),它在 ANSI 編碼系統中被編譯成_atoi(),而在 Unicode 編碼系統中編譯成_wtoi()。用_tcstoul()或者_tcstol()能夠把字符串轉化成任意進制的(無符號/有符號)長整數。

CString hex = _T("FAB");
CString decimal = _T("4011");
ASSERT(_tcstoul(hex, 0, 16) == _ttoi(decimal));

 

三、轉爲 char *

3.1 強制類型轉換爲 LPCTSTR,不能修改字符串

LPCTSTR p = s; 或者直接 (LPCTSTR)s;

3.2 使用 GetBuffer 方法

不給 GetBuffer 傳遞參數時它使用默認值 0,意思是:「給我這個字符串的指針,我保證不加長它」。假設你想增長字符串的長度,就必須將你須要的字符空間大小(注意:是字符而不是字節,由於 CString 是以隱含方式感知 Unicode 的)傳給它。當調用 ReleaseBuffer 時,字符串的實際長度會被從新計算,而後存入 CString 對象中。
必須強調一點,在 GetBuffer 和 ReleaseBuffer 之間這個範圍,必定不能使用你要操做的這個緩衝的 CString 對象的任何方法。由於 ReleaseBuffer 被調用以前,該 CString 對象的完整性得不到保障。

LPTSTR p = s.GetBuffer();
// do something with p
int m = s.GetLength(); // 可能出錯!!!
s.ReleaseBuffer();
int n = s.GetLength(); // 保證正確

四、其餘

4.1 分割字符串

AfxExtractSubString(CString& rString, LPCTSTR lpszFullString, int iSubString, TCHAR chSep = '/n');

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, 2, '-'); // 獲得 hijk
AfxExtractSubString(csTemp, (LPCTSTR)csFullString, 3, '-'); // 獲得 lmn

分隔符能夠隨便指定: AfxExtractSubString(csTemp, (LPCTSTR)csFullString, 0, 'f'); // 獲得 abcd-e

相關文章
相關標籤/搜索