字符類型、字符指針類型、字符串字面值
字符類型:
char, wchar_t, CHAR, WCHAR, TCHAR, UCHAR, BYTE, TBYTE
char 是C語言標準數據類型,字符型。通常由編譯器決定一個char對象有多少個字節組成,一般是一字節。
wchar_t 是char的Unicode版本。相當於 unsigned short。一般兩個字節。
CHAR 參照定義: typedef char CHAR;
WCHAR 參照定義:typedef wchar_t WHAR;
TCAHR 通用版字符類型:在ANSI編譯方式下爲 char , 在Unicode 編譯方式下爲 wchar_t。
UCHAR 相當於unsigned char
BYTE 相當於unsigned char。在取得字符編碼(00 - FF)時,非常有用。
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;
// 字符定義總結如下:
自適應 非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
靜態字符串指針 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)
// 總結如下:
// 字符串字面值表示:
// 非UNICODE: " "
// UNICODE : L" "
// 字符串字面值表示,總結如下:
通用 非UNICODE UNICODE
__T(x) x L ## x
_T(x) x L ## x
_TEXT(x) x L ## x
參照winnt.h頭件如下定義:
#ifdef UNICODE // 以下是Unicode相關定義
#define __TEXT(quote) quote // 定義字符串常量宏
#endif /* UNICODE */
#define TEXT(quote) __TEXT(quote)// 定義另一個字符串常量宏
字符串表示 __TEXT(quote) quote L ## quote
字符串表示 TEXT(quote) quote L ## quote
c++字符串操作經驗集
字符串處理函數總結:
標準c中的strcpy,strchr,strcat等只能用於ANSI字符串,不能正確處理Unicode字符串,因此也提供了一組補充函數,功能等價,但用於Unicode碼。
我們來看看string .h字符串頭文件中是怎樣處理char*和wchar_t*兩個字符串版本的:
char *strcat(char*,const char*);
wchar_t *wcschr(wchat_t*,const wchar_t *)
類似的還有strchr/wcschr,strcmp/wcscmp,strlen/wcslen...
ANSI 操作函數以str開頭 strcpy
Unicode 操作函數以wcs開頭 wcscpy
MBCS 操作函數以_mbs開頭 _mbscpy
ANSI/Unicode 操作函數以_tcs開頭 _tcscpy(C運行期庫)
ANSI/Unicode 操作函數以lstr開頭 lstrcpy(Windows函數)
各種字符串處理函數庫
1 C運行庫對字符串的處理:
str*系列: C運行庫早期使用strlen strcpy等str*系列函數對char類型的字符串進行處理。
wcs*系列: C編譯器內置了wchar_t這個16位寬字節類型後,使用新的wcslen wcscpy等wcs*系列的函數對wchar_t類型的字符串進行處理。
_tcs*系列: C運行庫定義了宏_tcslen _tcscpy等_tcs*系列的宏定義,_tcs*系列函數在編譯時根據是否預定義了宏_UNICODE而確定是採用wcs*系列函數,否則採用str*系列函數。
_tcs*_s系列: C運行庫的最新安全字符串函數,爲了防止緩衝區溢出而定義的新函數。
2 windows對字符串的處理:
Windows開發團隊在winnt.h中定義了新的數據類型CHAR(char), WCHAR(wchar_t), TCHAR,TCHAR最終在編譯時根據是否預定義了UNICODE宏而確定是CHAR還是WCHAR。
lstr*a系列: 在windows操作系統的Kernel32.dll中定義,處理CHAR類型的字符串,其實是對lstr*w的一層包裝。
lstr*w系列: 在windows操作系統的Kernel32.dll中定義,處理WCHAR類型的字符串。
lstr*系列: lstr*系列函數也是在編譯時才根據是否預定義了UNICODE宏來確定採用lstr*a系列函數,還是lstr*w系列函數。
個人推薦用lstr*系列,因爲這個是windows api,這樣寫出來的程序不用把C運行庫鏈接進來。
有個需要注意的是,C運行庫的_UNICODE和Windows的UNICODE,兩個宏,要麼同時定義,要麼同時不定義。C運行庫前綴下劃線是爲了遵守那個該死的C++標準(對於不屬於C++標準的宏加下劃線),而Windows沒有遵守那個標準
字符(串)之間的轉換
1.使用ATL的字符串轉換宏,可以實現不同類型的字符串轉換。
在宏名稱裏面,分別用A,W,T代表ANSI字符串,Unicode字符串,以及TCHAR字符串。
並分別用CA,CW,CT來代表相應的const字符串。
對ANSI字符串進行轉換操作的宏有A2W,A2T,A2CW,A2CT。
對Unicode字符串進行轉換操作的宏有W2A,W2T,W2CA,W2CT。
對TCHAR字符串進行轉換操作的宏有T2W,T2A,T2CW,T2CA。
*需要注意的是: 在使用以上宏的時候,必須在程序中定義如下宏,
USES_CONVERSION;
2. 字符串與其他類型之間的轉換
字符串和INT的相互轉換
通過atoi,_wtoi,_ttoi可以分別把ANSI,Unicode和TCHAR字符串轉換成INT。
通過_itoa,_itow,_itot可以分別把INT轉換成ANSI,Unicode和TCHAR字符串。
字符串和LONG的相互轉換
通過atol,_wtol,_ttol可以分別把ANSI,Unicode和TCHAR字符串轉換成LONG
通過_ltoa,_ltow,_ltot可以分別把INT轉換成ANSI,Unicode和TCHAR字符串。
字符串和DOUBLE的相互轉換
通過atof,_wtof,_ttof可以分別把ANSI,Unicode和TCHAR字符串轉換成DOUBLE
通過_fcvt 可以把DOUBLE數值轉換爲ANSI字符串。
ANSI 和 UNICODE 的函數對應表
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語言字符串函數詳解 strcpy、strcmp、strcat、strlen、strstr
http://write.blog.csdn.net/postedit/7300418
atoi, itoa 字符串轉換函數源代碼
http://blog.csdn.net/ltag0110rtag/article/details/7363919