原文地址:https://blog.csdn.net/ltag0110rtag/article/details/7363780
字符類型睁壁、字符指針類型、字符串字面值
字符類型:
char, wchar_t, CHAR, WCHAR, TCHAR, UCHAR, BYTE, TBYTE
char 是C語言標(biāo)準(zhǔn)數(shù)據(jù)類型葱蝗,字符型忍些。通常由編譯器決定一個(gè)char對(duì)象有多少個(gè)字節(jié)組成觉吭,一般是一字節(jié)。
wchar_t 是char的Unicode版本憔古。相當(dāng)于 unsigned short遮怜。一般兩個(gè)字節(jié)。
CHAR 參照定義: typedef char CHAR;
WCHAR 參照定義:typedef wchar_t WHAR;
TCAHR 通用版字符類型:在ANSI編譯方式下為 char 鸿市, 在Unicode 編譯方式下為 wchar_t锯梁。
UCHAR 相當(dāng)于unsigned char
BYTE 相當(dāng)于unsigned char。在取得字符編碼(00 - FF)時(shí)焰情,非常有用陌凳。
TBYTE 通用版字符類型:在ANSI編譯方式下為 char , 在Unicode 編譯方式下為 wchar_t内舟。
參照 tchar.h頭文件定義:
// _UNICODE 版
#ifndef __TCHAR_DEFINED
typedef wchar_t _TCHAR;
typedef wchar_t _TSCHAR;
typedef wchar_t _TUCHAR;
typedef wchar_t _TXCHAR;
#define __TCHAR_DEFINED
#endif
typedef wchar_t TCHAR;
// 非_UNICODE 版
#ifndef __TCHAR_DEFINED
typedef char _TCHAR;
typedef signed char _TSCHAR;
typedef unsigned char _TUCHAR;
typedef char _TXCHAR;
#define __TCHAR_DEFINED
#endif
typedef char TCHAR;
// 字符定義總結(jié)如下:
自適應(yīng) 非UNICODE UNICODE
_TCHAR char wchar_t
_TSCHAR signed char wchar_t
_TUCHAR unsigned char wchar_t
_TXCHAR char wchar_t
TCHAR char wchar_t
字符指針類型:
PSTR合敦,PWSTR,通用版: PTSTR验游,PTCH
LPSTR充岛,LPWSTR,通用版:LPTSTR , LPTCH
typedef CHAR *PSTR, *LPSTR;
typedef WCHAR *PWSTR, *LPWSTR;
PCSTR耕蝉,PCWSTR崔梗,通用版:PCTSTR
LPCSTR,LPCWSTR垒在,通用版:LPCTSTR
typedef CONST CHAR *PCSTR, *LPCSTR;
typedef CONST WCHAR *PCWSTR, *LPCWSTR;
解釋 通用版 非UNICODE UNICODE
字符定義 TCHAR CHAR WCHAR
字符指針 PTCHAR CHAR * WCHAR *
字符串指針 LPTCH & PTCH LPSTR & PSTR LPWSTR & PWSTR
字符串指針 LPTSTR & PTSTR LPSTR & PSTR LPWSTR & PWSTR
靜態(tài)字符串指針 LPCTSTR & PCTSTR LPCSTR & PCSTR LPCWSTR & PCWSTR
字符串字面值:
參照tchar.h頭文件如下定義:
// _UNICODE 版
#define __T(x) L ## x
// 非_UNICODE 版
#define __T(x) x
// -----------------------------------------
#define _T(x) __T(x)
#define _TEXT(x) __T(x)
// 總結(jié)如下:
// 字符串字面值表示:
// 非UNICODE: " "
// UNICODE : L" "
// 字符串字面值表示蒜魄,總結(jié)如下:
通用 非UNICODE UNICODE
__T(x) x L ## x
_T(x) x L ## x
_TEXT(x) x L ## x
參照winnt.h頭件如下定義:
#ifdef UNICODE // 以下是Unicode相關(guān)定義
#define __TEXT(quote) quote // 定義字符串常量宏
#endif /* UNICODE */
#define TEXT(quote) __TEXT(quote)// 定義另一個(gè)字符串常量宏
字符串表示 __TEXT(quote) quote L ## quote
字符串表示 TEXT(quote) quote L ## quote
c++字符串操作經(jīng)驗(yàn)集
字符串處理函數(shù)總結(jié):
標(biāo)準(zhǔn)c中的strcpy,strchr,strcat等只能用于ANSI字符串,不能正確處理Unicode字符串场躯,因此也提供了一組補(bǔ)充函數(shù)谈为,功能等價(jià),但用于Unicode碼推盛。
我們來看看string .h字符串頭文件中是怎樣處理char和wchar_t兩個(gè)字符串版本的:
char strcat(char,const char*);
wchar_t wcschr(wchat_t,const wchar_t *)
類似的還有strchr/wcschr峦阁,strcmp/wcscmp谦铃,strlen/wcslen...
ANSI 操作函數(shù)以str開頭 strcpy
Unicode 操作函數(shù)以wcs開頭 wcscpy
MBCS 操作函數(shù)以_mbs開頭 _mbscpy
ANSI/Unicode 操作函數(shù)以_tcs開頭 _tcscpy(C運(yùn)行期庫)
ANSI/Unicode 操作函數(shù)以lstr開頭 lstrcpy(Windows函數(shù))
各種字符串處理函數(shù)庫
1 C運(yùn)行庫對(duì)字符串的處理:
str系列: C運(yùn)行庫早期使用strlen strcpy等str系列函數(shù)對(duì)char類型的字符串進(jìn)行處理耘成。
wcs系列: C編譯器內(nèi)置了wchar_t這個(gè)16位寬字節(jié)類型后,使用新的wcslen wcscpy等wcs系列的函數(shù)對(duì)wchar_t類型的字符串進(jìn)行處理。
_tcs系列: C運(yùn)行庫定義了宏_tcslen _tcscpy等_tcs系列的宏定義瘪菌,_tcs系列函數(shù)在編譯時(shí)根據(jù)是否預(yù)定義了宏_UNICODE而確定是采用wcs系列函數(shù)撒会,否則采用str*系列函數(shù)。
_tcs*_s系列: C運(yùn)行庫的最新安全字符串函數(shù)师妙,為了防止緩沖區(qū)溢出而定義的新函數(shù)诵肛。
2 windows對(duì)字符串的處理:
Windows開發(fā)團(tuán)隊(duì)在winnt.h中定義了新的數(shù)據(jù)類型CHAR(char), WCHAR(wchar_t), TCHAR,TCHAR最終在編譯時(shí)根據(jù)是否預(yù)定義了UNICODE宏而確定是CHAR還是WCHAR默穴。
lstra系列: 在windows操作系統(tǒng)的Kernel32.dll中定義怔檩,處理CHAR類型的字符串,其實(shí)是對(duì)lstrw的一層包裝蓄诽。
lstrw系列: 在windows操作系統(tǒng)的Kernel32.dll中定義薛训,處理WCHAR類型的字符串。
lstr系列: lstr系列函數(shù)也是在編譯時(shí)才根據(jù)是否預(yù)定義了UNICODE宏來確定采用lstra系列函數(shù)仑氛,還是lstr*w系列函數(shù)乙埃。
個(gè)人推薦用lstr*系列,因?yàn)檫@個(gè)是windows api锯岖,這樣寫出來的程序不用把C運(yùn)行庫鏈接進(jìn)來介袜。
有個(gè)需要注意的是,C運(yùn)行庫的_UNICODE和Windows的UNICODE出吹,兩個(gè)宏遇伞,要么同時(shí)定義,要么同時(shí)不定義趋箩。C運(yùn)行庫前綴下劃線是為了遵守那個(gè)該死的C++標(biāo)準(zhǔn)(對(duì)于不屬于C++標(biāo)準(zhǔn)的宏加下劃線)赃额,而Windows沒有遵守那個(gè)標(biāo)準(zhǔn)
字符(串)之間的轉(zhuǎn)換
1.使用ATL的字符串轉(zhuǎn)換宏,可以實(shí)現(xiàn)不同類型的字符串轉(zhuǎn)換叫确。
在宏名稱里面跳芳,分別用A,W竹勉,T代表ANSI字符串飞盆,Unicode字符串,以及TCHAR字符串次乓。
并分別用CA吓歇,CW,CT來代表相應(yīng)的const字符串票腰。
對(duì)ANSI字符串進(jìn)行轉(zhuǎn)換操作的宏有A2W城看,A2T,A2CW杏慰,A2CT测柠。
對(duì)Unicode字符串進(jìn)行轉(zhuǎn)換操作的宏有W2A炼鞠,W2T,W2CA轰胁,W2CT谒主。
對(duì)TCHAR字符串進(jìn)行轉(zhuǎn)換操作的宏有T2W,T2A赃阀,T2CW霎肯,T2CA。
*需要注意的是: 在使用以上宏的時(shí)候榛斯,必須在程序中定義如下宏观游,
USES_CONVERSION;
2. 字符串與其他類型之間的轉(zhuǎn)換
字符串和INT的相互轉(zhuǎn)換
通過atoi,_wtoi驮俗,_ttoi可以分別把ANSI备典,Unicode和TCHAR字符串轉(zhuǎn)換成INT。
通過_itoa意述,_itow提佣,_itot可以分別把INT轉(zhuǎn)換成ANSI,Unicode和TCHAR字符串荤崇。
字符串和LONG的相互轉(zhuǎn)換
通過atol拌屏,_wtol,_ttol可以分別把ANSI术荤,Unicode和TCHAR字符串轉(zhuǎn)換成LONG
通過_ltoa倚喂,_ltow,_ltot可以分別把INT轉(zhuǎn)換成ANSI瓣戚,Unicode和TCHAR字符串端圈。
字符串和DOUBLE的相互轉(zhuǎn)換
通過atof,_wtof子库,_ttof可以分別把ANSI舱权,Unicode和TCHAR字符串轉(zhuǎn)換成DOUBLE
通過_fcvt 可以把DOUBLE數(shù)值轉(zhuǎn)換為ANSI字符串。
ANSI 和 UNICODE 的函數(shù)對(duì)應(yīng)表
ANSI UNICODE 通用
(char.h) (wchar.h) (tchar.h)
char wchar_t TCHAR
char * wchar_t * PTCHAR (PTSTR,LPWSTR,PWSTR,WCHAR)
printf wprintf _tprintf
scanf wscanf _tscanf
atoi _wtoi _ttoi
atol _wtol _ttol
itoa _itow _itot
ltoa _ltow _ltot
atof _wtof _tstof
strlen wcslen _tcslen
strcat wcscat _tcscat
strcpy wcscpy _tcscpy
strcmp wcscmp _tcscmp
C語言字符串函數(shù)詳解 strcpy仑嗅、strcmp宴倍、strcat、strlen仓技、strstr
http://write.blog.csdn.net/postedit/7300418
atoi, itoa 字符串轉(zhuǎn)換函數(shù)源代碼