char, wchar_t, TCHAR 字符全總結(jié) & c++字符串操作經(jīng)驗(yàn)集

原文地址: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ù)源代碼

http://blog.csdn.net/ltag0110rtag/article/details/7363919

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鸵贬,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子脖捻,更是在濱河造成了極大的恐慌阔逼,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件地沮,死亡現(xiàn)場離奇詭異嗜浮,居然都是意外死亡涯保,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門周伦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人未荒,你說我怎么就攤上這事专挪。” “怎么了片排?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵寨腔,是天一觀的道長。 經(jīng)常有香客問我率寡,道長迫卢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任冶共,我火速辦了婚禮乾蛤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捅僵。我一直安慰自己家卖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布庙楚。 她就那樣靜靜地躺著上荡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪馒闷。 梳的紋絲不亂的頭發(fā)上酪捡,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音纳账,去河邊找鬼逛薇。 笑死,一個(gè)胖子當(dāng)著我的面吹牛疏虫,可吹牛的內(nèi)容都是我干的金刁。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼议薪,長吁一口氣:“原來是場噩夢啊……” “哼尤蛮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起斯议,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤产捞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后哼御,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坯临,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡焊唬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了看靠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赶促。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖挟炬,靈堂內(nèi)的尸體忽然破棺而出鸥滨,到底是詐尸還是另有隱情,我是刑警寧澤谤祖,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布婿滓,位于F島的核電站,受9級(jí)特大地震影響粥喜,放射性物質(zhì)發(fā)生泄漏凸主。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一额湘、第九天 我趴在偏房一處隱蔽的房頂上張望卿吐。 院中可真熱鬧,春花似錦锋华、人聲如沸但两。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谨湘。三九已至,卻和暖如春芥丧,著一層夾襖步出監(jiān)牢的瞬間紧阔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國打工续担, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留擅耽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓物遇,卻偏偏與公主長得像乖仇,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子询兴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容