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

xiaoxiao2021-02-28  40

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等宏基本上不需要啦

转载请注明原文地址: https://www.6miu.com/read-76707.html

最新回复(0)