转自: http://www.cnblogs.com/magic-cube/archive/2011/05/12/2044713.html

 

.类型简介

1. wchar_twchar_tc++中用来表示宽字节的数据类型,即unicode编码的数据类型

char   charc中的字符数据类型,属于ASCII编码。

 

2: TCHARTCHAR有二意性,其定义为:

#ifdef UNICODE

typedef wchar_t  TCHAR

#else

typedef char     TCHAR

#endif

也就是说,如果我们使用unicode编码,那么TCHAR指的就是wchat_t,如果我们使用的是ASCII编码,那么TCHAR指的就是char,这样处理的目的是为了程序的可移植性。T表示在Win32环境中, 有一个_T宏 。

 

3.WCHAR WCHAR其实也是一个宏,表示的就是wchar_t,为了书写方便重新定义的一个宏而已,其定义为:

typedef wchat_t WCHAR

 

4.CString动态的TCHAR数组。所以有二义性.它是一个完全独立的类,封装了“+”等操作符和字符串操作方法,换句话说就是CString是对TCHAR操作的方法的集合。

 

5.LPCTSTR常量的TCHAR指针.

typedef const TCHAR* LPCTSTR

 

L:   表示long指针,是为了兼容的作用。没有实际意义。

P:   表示这是一个指针

C:   表示是一个常量

T:   表示在Win32环境中, 有一个_T

STR: 表示这个变量是一个字符串

6.LPTSTRTCHAR指针,其定义为

typedef TCHAR* LPTSTR

 

LPT的含义同上。

 

7: msdn上给出的定义:

 

type         Meaning in MBCS builds     Meaning in Unicode builds

WCHAR        wchar_t                    wchar_t

LPSTR        char*                      char*

LPCSTR       const char*                const char*

LPWSTR       wchar_t*                   wchar_t*

LPCWSTR     const wchar_t*             const wchar_t*

TCHAR       char                       wchar_t

LPTSTR       TCHAR*                     TCHAR*

LPCTSTR      const TCHAR*               const TCHAR*

 

8.stringstringc++中的字符串变量,因为操作c类型的char非常麻烦,而且很容易出现内存泄漏,所以c++就对c中的char 进行了封装,其中

包含赋值,删除,增加等常用操作,这些操作都不用考虑内存,为了使用更加方便,所以能使用string就尽量使用,必须包含其头文件

#include <string>

注意不是:

#include <string.h>

因为string.hC字符串头文件

 

string中常用的函数有:

1: =, assign()               //赋以新值

2: swap()                    //交换两个字符串的内容

3: +=,append(),push_back()   //在尾部添加字符

4: insert()                  //插入字符

5: erase()                   //删除字符

6: clear()                   //删除全部字符

7: replace()                 //替换字符

8: +                         //串联字符串

9: ==,!=,<,<=,>,>=,compare() //比较字符串

10: size(),length()          //返回字符数量

11: max_size()               //返回字符的可能最大个数

12: empty()                  //判断字符串是否为空

13: capacity()               //返回重新分配之前的字符容量

14: reserve()                //保留一定量内存以容纳一定数量的字符

15: [ ], at()                //存取单一字符

16: >>,getline()             //stream读取某值

17: <<                       //将谋值写入stream

18: copy()                   //将某值赋值为一个C_string

19: c_str()                  //将内容以C_string返回

20: data()                   //将内容以字符数组形式返回

21: substr()                 //返回某个子字符串

22:                          //查找函数

23: begin() end()            //提供类似STL的迭代器支持

24: rbegin() rend()          //逆向迭代器

25: get_allocator()          //返回配置器

 

.相互转化

既然有定义了这么多的数据类型,所以他们之间的相互转化是少不了的

CStringLPCTSTR的转化

CStringLPCTSTR不需要转化,两者是等价的,所以

CString str("cstring");

LPCTSTR pcStr = str;

 

2.CStringLPTSTR的转化:

下述转法虽然可以,但是却不安全:

CString str("string");

LPTSTR pStr = (LPTSTR)(LPCTSTR)(str);

因为本来转化后的字符串变得可以修改了,造成了安全隐患。

正确的转化方法为:

 

CString str("string");

LPTSTR pStr = str.GetBuffer();

str.ReleaseBuffer();

注意:GetBuffer()ReleaseBuffer()之间不可以调用任何的CString函数,比如GetLength()函数,因为无法预测对内存的操作,所以任何CString函数得到的结果都是不确定的。

 

3.CStringWCHAR*(wchar_t*)的转化

方法一:使用wcscpy()函数

CString str("string");

WCHAR pWchar[100];

wcscpy(pWchar,str);

 

方法二:使用wcscpy_s()函数

CString str("string");

WCHAR pWchar[100];

wcscpy(pWchar,100,str);  //指定了长度

 

方法三:使用_tcscpy()函数

CString str("string");

WCHAR pStr[100];

_tcscpy(pStr,str);

 

方法四:使用_tcscpy_s()函数

CString str("string");

WCHAR pStr[100];

_tcscpy_s(pStr,100,str);  //指定了长度

 

4.CStringchar*的转化

方法一:使用wcstombs()函数

CString str("string");

char pChar[100];

wcstombs(pChar,str,100);

 

方法二:使用wcstombs_s()函数

同上面一样,wcstombs_s()wcstombs()的安全版本:

 

posted on 2011-11-06 14:33  o无尘o  阅读(1032)  评论(0编辑  收藏  举报