char* string CString比較總結
(一) 概述
string和CString均是字串模板類,string為標準模板類(STL)定義的字串類,已經納入C++標準之中;
CString(typedef CStringT > CString)為Visual C++中最常用的字串類,繼承自CSimpleStringT類,主要應用在MFC和ATL編程中,主要資料類型有char(應用於ANSI),wchar_t(unicode),TCHAR(ANSI與unicode均可);
char*為C編程中最常用的字串指標,一般以'/0'為結束標誌;
(二) 構造
string是方便的,可以從幾乎所有的字串構造而來,包括CString和char*;
CString次之,可以從基本的一些字串變數構造而來,包括char*等;
char*沒有建構函式,僅可以賦值;
舉例:
char* psz = “joise”;
CString cstr( psz );
string str( cstr );
(三) 運算子多載
a) operator=
string是最方便的,幾乎可以直接用所有的字串賦值,包括CString和char*;
CString次之,可以直接用些基本的字串賦值,包括char*等;
char*只能由指標賦值,並且是極危險的操作,建議使用strcpy或者memcpy,而且char*在聲明的時候如未賦初值建議先設為NULL,以避免野指標,令你抓狂;
舉例:
char *psz = NULL;
psz = new char[10]; //當然,以上的直接寫成char *psz = new char[10];也是一樣
memset( psz, 0, 10 );
strcpy( psz, “joise” );
CString cstr;
cstr = psz;
string str;
str = psz;
str = cstr;
delete []psz;
b) operator+
string與CString差不多,可以直接與char*進行加法,但不可以相互使用+運算子,即string str = str + cstr是非法的,須轉換成char*;
char*沒有+運算,只能使用strcat把兩個指標連在一起;
舉例:
char* psz = “joise”;
CString cstr = psz;
cstr = cstr + psz;
string str = psz;
str = str + str + psz;
strcat( psz, psz );
strcat( psz, cstr );//合法
strcat( psz, str );//非法,由此可見,CString可自動轉換為const char*,而string不行
c) operator +=
string是最強大的,幾乎可以與所有的字串變數+=,包括CString和char*;
CString次之,可以與基本的一些字串變數進行+=而來,包括char*等;
char*沒有+=運算子,只能使用strcat把兩個指標連在一起;
d) operator[]
CString最好,當越界時會拋出斷言異常;
string與char*下標越界結果未定義;
舉例:
char* psz = “joise”;
CString cstr = psz;
cout 、operator= 、perator
operator=
operator==
operator!=Collate
Compare
尋找指定值(不區分大小寫)_stricmp
_strnicmp
_stricoll
_strnicollCollateNoCase
CompareNoCas
註:傳回值如果
CString > string > char*;
(六) 靈活性
CString > string >char*;
(七) 可移植性
char* = string > CString
String,CString,TCHAR,char之間區別和聯絡
2008-07-25 19:53
char是類型
TCHAR也是!不過他可以通過是否定義了UNICODE宏來判斷到底是
char還是w_char;
TCHAR是一種字串類型,它讓你在以MBCS和UNNICODE來build程式時可以使用同樣的代碼,不需要使用繁瑣的宏定義來包含你的代碼,而char代表ASCII的字元
#ifdef UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif
所以用MBCS來build時,TCHAR是char,使用UNICODE時,TCHAR是wchar_t.
至於String,CString他們都是一種封裝了字串處理的操作!
你可以開啟他們的原始碼找尋究竟!
CString屬於VC的類庫
string是標準C++的類庫
string.h是C的庫函數。
研究它們的源代好些!
TCHAR,char是可以同整型互換的類型。
String,CString代表了一塊記憶體地區。
TCHAR 賦值
#include
TCHAR szWindowText[256]=_T("QQ2006");
char*、TCHAR*轉換CString
CString str(****)
下面詳細寫一下其它轉換
//////////////////////////////
/*
***********************************************************************
* 函數: TransCStringToTCHAR
* 描述:將CString 轉換為 TCHAR*
* 日期:
***********************************************************************
*/
TCHAR* CPublic::CString2TCHAR(CString &str)
{
int iLen = str.GetLength();
TCHAR* szRs = new TCHAR[iLen];
lstrcpy(szRs, str.GetBuffer(iLen));
str.ReleaseBuffer();
return szRs;
}
/*
***********************************************************************
* 函數: THCAR2Char
* 描述:將TCHAR* 轉換為 char*
* 日期:
***********************************************************************
*/
char* CPublic::THCAR2char(TCHAR* tchStr)
{
int iLen = 2*wcslen(tchStr);//CString,TCHAR漢字算一個字元,因此不用普通計算長度
char* chRtn = new char[iLen+1]
wcstombs(chRtn,tchStr,iLen+1);//轉換成功返回為非負值
return chRtn;
}
/*
***********************************************************************
* 函數: CString2char
* 描述:將CString轉換為 char*
* 日期:
***********************************************************************
*/
char* CPublic::CString2char(CString &str)
{
int len = str.GetLength();
char* chRtn = (char*)malloc((len*2+1)*sizeof(char));//CString的長度中漢字算一個長度
memset(chRtn, 0, 2*len+1);
USES_CONVERSION;
strcpy((LPSTR)chRtn,OLE2A(str.LockBuffer()));
return chRtn;
}
//參考
///////////////////////
//Pocket PC上的UNICODE和ANSI字串
//By Vassili Philippov, September 26, 2001.
//楊方思歧 譯
////////////////////////
/*
***********************************************************************
* 函 數 名:GetAnsiString
* 描 述:將CString(unicode)轉換為char*(ANSI)
* 參 數:CString &s 要轉換的CString
* 返 回 值:返迴轉換結果
* 建立日期:
* 最後修改:
***********************************************************************
*/
char* GetAnsiString(const CString &s)
{
int nSize = 2*s.GetLength();
char *pAnsiString = new char[nSize+1];
wcstombs(pAnsiString, s, nSize+1);
return pAnsiString;
}
//////////////////////////////