char, wchar_t, TCHAR 字符全总结 & c++字符串操作经验集

原文地址:https://blog.csdn.net/ltag0110rtag/article/details/7363780

字符类型、字符指针类型、字符串字面值

字符类型:

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。

lstra系列: 在windows操作系统的Kernel32.dll中定义,处理CHAR类型的字符串,其实是对lstrw的一层包装。
lstrw系列: 在windows操作系统的Kernel32.dll中定义,处理WCHAR类型的字符串。
lstr
系列: lstr系列函数也是在编译时才根据是否预定义了UNICODE宏来确定采用lstra系列函数,还是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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容