string,char*及CString類型的相互轉換
首先先介紹一下什麽是CString
CString是MFC的字符串類,它不是基本類型,而是對字符串的封裝,它是自適應的,在UNICODE環境下就是CStringW,在非UNICODE環境下就是CStringA。
如從對話框中利用 GetWindowText 得到的字符串就是 CString 類型, CString 定義在頭文件中。CString(typedef CStringT> CString) 為 Visual C++ 中最常用的字符串類,
繼承自 CSimpleStringT 類,主要應用在 MFC 和 ATL 編程中,所以使用 CString 時要包含 afx.h 文件#include 。
一:char*與string:
1.string----->char*
1)char *ch = str.c_str();
2)char* ch = str.data();
3)string mngName;
char t[200];
memset(t,0,200);
strcpy(t,mngName.c_str());
2.char*----->string
1)string s1 = ch;
2)string str = string(ch);
3)string str(ch);
在不是初始化的地方最好還是用assign().
二:char*與CString:
1.CString----->char*:
1)CString cstr="Hello Word!";
char* ch=cstr.getbuffer(cstr.length());
2. char*----->CString:直接賦值或者格式化即可
1) CString cStr1 = ch;
2) CString cStr2 = CString(ch);
3)CString cStr2(ch);
但是,如果數組中有中文話,在Unicode環境下就會出現亂碼。這時要麽進行轉換,要麽可以如下方法:CString str(ch);或者 CString str = ch.c_str();
3.CString-----> char[100]:
1)char a[100];
CString str("aaaaaa");
strncpy(a,(LPCTSTR)str,sizeof(a));
2)CString str="aaa";
char* ch;
ch=(char*)(LPCTSTR)str;
三:string與CString:
1.string----->CString
string s,s1,s2,s3;
CString cstr2,cstr;
1) str = CString(s); //直接復制丟給構造會自己轉換
2) CString cstr(s1.c_str());
3)cstr2.Format("%s", s2.c_str());
4)cstr2.Format("%s", s3.data());
2.CString----->string
CString類型變量可以直接給string類型變量賦值,但是string類型不能對CString類型直接賦值。
CString cStr = "adsad",cstr3;
1)string str = cStr;
2)str=cstr3.GetBuffer(0); GetBuffer()後一定要ReleaseBuffer(),否則就沒有釋放緩沖區所占的空間.
str.ReleaseBuffer();
3)str = LPCSTR(cstr);
https://technet.microsoft.com/zh-cn/w6w3kbaf(zh-tw).aspx
https://technet.microsoft.com/zh-cn/ms235389
附:LPCSTR解釋
類型理解LPCTSTR類型:
L表示long指針 這是為了兼容Windows 3.1等16位操作系統遺留下來的,在win32中以及其他的32位操作系統中, long指針和near指針及far修飾符都是為了兼容的作用。沒有實際意義。
P表示這是一個指針
C表示是一個常量
T表示在Win32環境中, 有一個_T宏
STR表示這個變量是一個字符串 詳細釋義 這個宏用來表示你的字符是否使用UNICODE, 如果你的程序定義了UNICODE或者其他相關的宏,那麽這個字符或者字符串將被作為UNICODE字符串,否則就是標準的ANSI字符串。
所以LPCTSTR就表示一個指向常固定地址的可以根據一些宏定義改變語義的字符串。
在程序中我們大部分時間要使用帶T的類型定義。
LPCTSTR == const TCHAR *(TCHAR is wchar_t )
CString 和 LPCTSTR 可以說通用。 原因在於CString定義的自動類型轉換,沒什麽奇特的,最簡單的C++操作符重載而已。
常量字符串ansi和unicode的區分是由宏_T來決定的。但是用_T("abcd")時, 字符串"abcd"就會根據編譯時的是否定一_UNICODE來決定是char* 還是 w_char*。 同樣,TCHAR 也是相同目的字符宏。 看看定義就明白了。
string,char*及CString類型的相互轉換