1. 程式人生 > >CString轉string在unicode的情況下方法不同

CString轉string在unicode的情況下方法不同

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

也可以用

CString strMfc = "test";

USES_CONVERSION;
W2A(strMfc);

std::string->CString   例子: 

CString strMfc; 

std::string strStl=“test“; 

strMfc=strStl.c_str(); 

AfxExtractSubString是擷取字串的函式,很好用,不過美中不足的地方在與它只能使用單個字元作為分割符。

但是這種情況在很多時候都行不通,如果分割符需要是兩個字元以上呢?

之前因為這個問題試了很久,也在網上搜索過。不過可惜的是,網上的大部分關於VC擷取字串的文章都是那麼同樣的幾篇,都是寫的滿複雜然後可以實現了AfxExtractSubString功能而已的,也就是隻能用單個字元擷取,但是標題卻寫著用字串擷取字串,好笑!

不找了,自己寫吧。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是需要擷取的原字串,

CStringArray& dest 是最終結果的陣列

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

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

1、格式化字串

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

2、轉為 int

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

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

3、轉為 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、其他

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