CString与LPCWSTR、LPSTR、char*、LPWSTR等类型的转换【转】

来源(博客频道 - CSDN.NET)

From: http://blog.csdn.net/sl159/article/details/6412171

CString与LPCWSTR、LPSTR、char*、LPWSTR等类型的转换【转】

2011-05-11 15:49 13167人阅读

CString与LPCWSTR、LPSTR、char*、LPWSTR等类型的转换

VC++ 2010-09-25 21:23:12 阅读457 评论3 字号:大中小 订阅

一.CString与LPCWSTR

两者的不同:LPCWSTR 是Unicode字符串指针,初始化时串有多大,申请空间就有多大,以后存贮若超过则出现无法预料的结果,这是它与CString的不同之处。而CString是一个串类,内存空间类会自动管理。

CString转换成LPCWSTR

方法一:CString strFileName;

LPCWSTR lpcwStr = strFileName.AllocSysString();

方法二:CString str=_T("TestStr");

USES_CONVERSION;

LPCWSTR lpcwStr = A2CW((LPCSTR)str);

MFC中CString和LPSTR是可以通用,其中A2CW表示(LPCSTR) -> (LPCWSTR),USER_CONVERSION表示用来定义一些中间变量,在使用ATL的转换宏之前必须定义该语句。

LPCWSTR转换成CString

LPCWSTR lpcwStr = L"TestWStr";

CString str(lpcwStr);

CString str;

LPWSTR lpstr = (LPWSTR)(LPCWSTR)str;

二.CString与LPSTR转换

CString转换成LPSTR:

方法一:CString strFileName;

LPSTR lpStr = strFileName.GetBuffer();

strFileName.ReleaseBuffer();

方法二:CString strFileName;

LPSTR lpStr = (LPSTR)(LPCSTR)strFimeName;

LPSTR转换成CString:

LPSTR lpStr = L"TestStr";

CString str(lpStr);

注意:CString和LPCSTR可直接转换,如下:

CString str;

LPCSTR lpcStr = (LPCSTR)str;

三.CString和char*转换

CString转换成char*

方法一:CString str;

char* p = str.GetBuffer();

方法二:CString str;

char* p = (LPSTR)(LPCSTR)str;

char*转换成CString

char* p = "test";

CString str = ("%s",p);

四.String和int、float的转换

可以使用atoi,atof,atol等函数来完成。

五.LPSTR(char*)和LPWSTR的转换

可以使用下面的ATL宏来进行,最好是将变量定义成TCHAR、LPTSTR等T类型,可以避免转换。

ATL宏介绍:

A2BSTR   OLE2A       T2A       W2A
A2COLE   OLE2BSTR    T2BSTR    W2BSTR
A2CT     OLE2CA      T2CA      W2CA
A2CW     OLE2CT      T2COLE    W2COLE
A2OLE    OLE2CW      T2CW      W2CT
A2T      OLE2T       T2OLE     W2OLE
A2W      OLE2W       T2W       W2T


A :ANSI 字符串,也就是 MBCS。

W、OLE 宽字符串,也就是 UNICODE。

T 中间类型T。如果定义了 _UNICODE,则T表示W;如果定义了 _MBCS,则T表示A

C const 的缩写

利用这些宏,可以快速的进行各种字符间的转换。使用前必须包含头文件,并且申明USER_CONVERSION;使用 ATL 转换宏,由于不用释放临时空间,所以使用起来非常方便。但是考虑到栈空间的尺寸(VC 默认2M),使用时要注意几点:

1、只适合于进行短字符串的转换;

2、不要试图在一个次数比较多的循环体内进行转换;

3、不要试图对字符型文件内容进行转换,因为文件尺寸一般情况下是比较大的;

4、对情况 2 和 3,要使用 MultiByteToWideChar() 和 WideCharToMultiByte();

void Func1(LPSTR lpStr);

void Func2(LPWSTR lpwStr);

TCHAR name[256];

TCHAR* pName = new TCHAR[256];

Func1(name); // Func1(pName);

Func2(name); // Func2(pName);

注意在VS2005中上面用红色标记的代码已经不成立。

VS2005中CString已经改为宽字符型,一些转换如下:

char name[10];

TCHAR sex[5] ;

char *p = name;

TCHAR *pw = sex;

LPSTR lpstr = name;

LPCSTR lpcstr = name;

lpcstr = lpstr;

lpstr = p;

p = (char*)sex;

pw = (WCHAR*)name;

LPWSTR lpwstr = (LPWSTR)lpstr;

lpwstr = (LPWSTR)lpcstr;

LPCWSTR lpcwstr = (LPCWSTR)lpstr;

lpcwstr = (LPCWSTR)name;

CString str(lpstr);

CString str1(lpcstr);

CString str2(lpwstr);

CString str3(lpcwstr);

CString str4(name);

CString str5(sex);

lpwstr = (LPWSTR)(LPCWSTR)str;

lpstr = (LPSTR)(LPCWSTR)str;

lpcstr = (LPCSTR)(LPCWSTR)str;

p = (char*)str.GetBuffer();

pw = str.GetBuffer();

可以看出转换更加简单了,基本上可以直接转换,A2W等宏基本上不需要啦

Link: http://www.asm32.net/article_details.aspx?id=6970


浏览次数 0 发布时间 2016-03-18 01:34:29 从属分类 VC++ 【评论】【 】【打印】【关闭
 
| www.asm32.net | 2006版 | 资料中心 | linux | asm/asm32 | C/C++ | VC++ | java | Python | 书签 | ASP.Net书签 | 京ICP备09029108号-1