CStringintstringcharBSTR之间的转换.docx
- 文档编号:9315380
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:23
- 大小:26.22KB
CStringintstringcharBSTR之间的转换.docx
《CStringintstringcharBSTR之间的转换.docx》由会员分享,可在线阅读,更多相关《CStringintstringcharBSTR之间的转换.docx(23页珍藏版)》请在冰豆网上搜索。
CStringintstringcharBSTR之间的转换
一.CString,int,string,char*之间的转换
string转CString
CString.Format("%s",string.c_str());
char转CString
CString.Format("%s",char*);
char转string
strings(char*);
string转char*
char*p=string.c_str();
CString转string
strings(CString.GetBuffer());
1.string->CString
CString.Format("%s",string.c_str());
用c_str()确实比data()要好.
2.char->string
strings(char*);
你的只能初始化,在不是初始化的地方最好还是用assign().
3.CString->string
strings(CString.GetBuffer());
GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间.
《C++标准函数库》中:
有三个函数可以将字符串的内容转换为字符数组和C—string
1.data(),返回没有”\0“的字符串数组
2.c_str(),返回有”\0“的字符串数组
3.copy()
CString和int互转
将字符转换为整数,可以使用atoi、_atoi64或atol.
将数字转换为CString变量,可以使用CString的Format函数。
如
(1)CStrings;
inti=64;
s.Format("%d",i)
Format函数的功能很强,值得你研究一下。
(2)voidCStrDlg:
:
OnButton1()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CStringss="1212.12";
inttemp=atoi(ss);//字符转换为整数
CStringaa;
aa.Format("%d",temp);//整数转换为字符
AfxMessageBox("varis"+aa);
}
CString和char*互转
(1)char*->CString
CStringstrtest;
char*charpoint;
charpoint="givestringavalue";
strtest=charpoint;
(2)CString->char*
charpoint=strtest.GetBuffer(strtest.GetLength());
标准C里没有string,char*==char[]==string
可以用CString.Format("%s",char*)这个方法来将char*转成CString。
要把CString转成char*,用操作符(LPCSTR)CString就可以了。
CString->char[100]
chara[100];
CStringstr("aaaaaa");
strncpy(a,(LPCTSTR)str,sizeof(a));
CString类型的转换成int
(1)CString类型的转换成int,可以使用atoi、_atoi64或atol。
例:
CStringaaa="16";
intint_chage=atoi((lpcstr)aaa);
(2)将数字转换为CString变量,可以使用CString的Format函数。
例:
CStrings;
inti=64;
s.Format("%d",i)
CStringss="1212.12";
inttemp=atoi(ss);
CStringaa;
aa.Format("%d",temp);
如果是使用char数组,也可以使用sprintf函数。
数字->字符串除了用CString:
:
Format,还有FormatV、sprintf和不需要借助于Afx的itoa
string->char*
stringaa("aaa");
char*c=aa.c_str();
注:
1.string.c_str()只能转换成constchar*:
constchar*c=aa.c_str();
2.cannotconvertfrom'constchar*'to'char*'
3.要转成char*这样写:
stringmngName;
chart[200];
memset(t,0,200);
strcpy(t,mngName.c_str());
BSTR转换成char*
方法一:
使用ConvertBSTRToString。
例如:
#include#pragmacomment(lib,"comsupp.lib")
int_tmain(intargc,_TCHAR*argv[])
{
BSTRbstrText=:
:
SysAllocString(L"Test");
char*lpszText2=_com_util:
:
ConvertBSTRToString(bstrText);
SysFreeString(bstrText);//用完释放
delete[]lpszText2;
return0;
}
方法二:
使用_bstr_t的赋值运算符重载。
例如:
_bstr_tb=bstrText;
char*lpszText2=b;
char*转换成BSTR
方法一:
使用SysAllocString等API函数。
例如:
BSTRbstrText=:
:
SysAllocString(L"Test");
BSTRbstrText=:
:
SysAllocStringLen(L"Test",4);
BSTRbstrText=:
:
SysAllocStringByteLen("Test",4);
方法二:
使用COleVariant或_variant_t。
例如:
COleVariantstrVar("Thisisatest");
_variant_tstrVar("Thisisatest");
BSTRbstrText=strVar.bstrVal;
方法三,使用_bstr_t,这是一种最简单的方法。
例如:
BSTRbstrText=_bstr_t("Thisisatest");
方法四,使用CComBSTR。
例如:
BSTRbstrText=CComBSTR("Thisisatest");
或CComBSTRbstr("Thisisatest");
BSTRbstrText=bstr.m_str;
方法五,使用ConvertStringToBSTR。
例如:
char*lpszText="Test";
BSTRbstrText=_com_util:
:
ConvertStringToBSTR(lpszText);
CString转换成BSTR
通常是通过使用CStringT:
:
AllocSysString来实现。
例如:
CStringstr("Thisisatest");
BSTRbstrText=str.AllocSysString();
…
SysFreeString(bstrText);//用完释放
BSTR转换成CString
一般可按下列方法进行:
BSTRbstrText=:
:
SysAllocString(L"Test");
CStringAstr;
str.Empty();
str=bstrText;
或CStringAstr(bstrText);
ANSI、Unicode和宽字符之间的转换
方法一:
使用MultiByteToWideChar将ANSI字符转换成Unicode字符,
使用WideCharToMultiByte将Unicode字符转换成ANSI字符。
方法二:
使用“_T”将ANSI转换成“一般”类型字符串,使用“L”将ANSI转换成Unicode
在托管C++环境中还可使用S将ANSI字符串转换成String*对象。
例如:
TCHARtstr[]=_T("thisisatest");
wchar_twszStr[]=L"Thisisatest";
String*str=S”Thisisatest”;
方法三:
使用ATL7.0的转换宏和类。
ATL7.0在原有3.0基础上完善和增加了许多字符串转换宏以及提供相应的类:
其中,第一个C表示“类”,以便于ATL3.0宏相区别,第二个C表示常量,2表示“to”,EX表示要开辟一定大小的缓冲。
SourceType和DestinationType可以是A、T、W和OLE,其含义分别是ANSI、Unicode、“一般”类型和OLE字符串。
例如:
CA2CT就是将ANSI转换成一般类型的字符串常量。
下面是一些示例代码:
LPTSTRtstr=CA2TEX<16>("thisisatest");
LPCTSTRtcstr=CA2CT("thisisatest");
wchar_twszStr[]=L"Thisisatest";
char*chstr=CW2A(wszStr);
二.VC字符串转换(BSTRCString)
一.BSTR、LPSTR和LPWSTR
在VisualC++.NET的所有编程方式中,我们常常要用到这样的一些基本字符串类型,如BSTR、LPSTR和LPWSTR等。
之所以出现类似上述的这些数据类型,是因为不同编程语言之间的数据交换以及对ANSI、Unicode和多字节字符集(MBCS)的支持。
那么什么是BSTR、LPSTR以及LPWSTR呢?
1.BSTR(BasicSTRing,Basic字符串)是一个OLECHAR*类型的Unicode字符串。
它被描述成一个与自动化相兼容的类型。
由于操作系统提供相应的API函数(如SysAllocString)来管理它以及一些默认的调度代码,因此BSTR实际上就是一个COM字符串,但它却在自动化技术以外的多种场合下得到广泛使用。
2.LPSTR和LPWSTR是Win32和VC++所使用的一种字符串数据类型。
LPSTR被定义成是一个指向以NULL(‘\0’)结尾的8位ANSI字符数组指针,而LPWSTR是一个指向以NULL结尾的16位双字节字符数组指针。
在VC++中,还有类似的字符串类型,如LPTSTR、LPCTSTR等。
例如,LPCTSTR是指“longpointertoaconstantgenericstring”,表示“一个指向一般字符串常量的长指针类型”,与C/C++的constchar*相映射,而LPTSTR映射为char*。
一般地,还有下列类型定义:
#ifdefUNICODE
typedefLPWSTRLPTSTR;
typedefLPCWSTRLPCTSTR;
#else
typedefLPSTRLPTSTR;
typedefLPCSTRLPCTSTR;
#endif
二.CString、CStringA和CStringW
VisualC++.NET中将CStringT作为ATL和MFC的共享的“一般”字符串类,它有CString、CStringA和CStringW三种形式,分别操作不同字符类型的字符串。
这些字符类型是TCHAR、char和wchar_t。
TCHAR在Unicode平台中等同于WCHAR(16位Unicode字符),在ANSI中等价于char。
wchar_t通常定义为unsignedshort。
由于CString在MFC应用程序中经常用到,这里不再重复。
三、VARIANT、COleVariant和_variant_t
在OLE、ActiveX和COM中,VARIANT数据类型提供了一种非常有效的机制,由于它既包含了数据本身,也包含了数据的类型,因而它可以实现各种不同的自动化数据的传输。
下面让我们来看看OAIDL.H文件中VARIANT定义的一个简化版:
structtagVARIANT{
VARTYPEvt;
union{
shortiVal;//VT_I2.
longlVal;//VT_I4.
floatfltVal;//VT_R4.
doubledblVal;//VT_R8.
DATEdate;//VT_DATE.
BSTRbstrVal;//VT_BSTR.
…
short*piVal;//VT_BYREF|VT_I2.
long*plVal;//VT_BYREF|VT_I4.
float*pfltVal;//VT_BYREF|VT_R4.
double*pdblVal;//VT_BYREF|VT_R8.
DATE*pdate;//VT_BYREF|VT_DATE.
BSTR*pbstrVal;//VT_BYREF|VT_BSTR.
};
};
显然,VARIANT类型是一个C结构,它包含了一个类型成员vt、一些保留字节以及一个大的union类型。
例如,如果vt为VT_I2,那么我们可以从iVal中读出VARIANT的值。
同样,当给一个VARIANT变量赋值时,也要先指明其类型。
例如:
VARIANTva;
:
:
VariantInit(&va);//初始化
inta=2002;
va.vt=VT_I4;//指明long数据类型
va.lVal=a;//赋值
为了方便处理VARIANT类型的变量,Windows还提供了这样一些非常有用的函数:
VariantInit——将变量初始化为VT_EMPTY;
VariantClear——消除并初始化VARIANT;
VariantChangeType——改变VARIANT的类型;
VariantCopy——释放与目标VARIANT相连的内存并复制源VARIANT。
COleVariant类是对VARIANT结构的封装。
它的构造函数具有极为强大大的功能,当对象构造时首先调用VariantInit进行初始化,然后根据参数中的标准类型调用相应的构造函数,并使用VariantCopy进行转换赋值操作,当VARIANT对象不在有效范围时,它的析构函数就会被自动调用,由于析构函数调用了VariantClear,因而相应的内存就会被自动清除。
除此之外,COleVariant的赋值操作符在与VARIANT类型转换中为我们提供极大的方便。
例如下面的代码:
COleVariantv1("Thisisatest");//直接构造
COleVariantv2="Thisisatest";
//结果是VT_BSTR类型,值为"Thisisatest"
COleVariantv3((long)2002);
COleVariantv4=(long)2002;
//结果是VT_I4类型,值为2002
_variant_t是一个用于COM的VARIANT类,它的功能与COleVariant相似。
不过在VisualC++.NET的MFC应用程序中使用时需要在代码文件前面添加下列两句:
#include"comutil.h"
#pragmacomment(lib,"comsupp.lib")
四.CComBSTR和_bstr_t
CComBSTR是对BSTR数据类型封装的一个ATL类,它的操作比较方便。
例如:
CComBSTRbstr1;
bstr1="Bye";//直接赋值
OLECHAR*str=OLESTR("tata");//长度为5的宽字符
CComBSTRbstr2(wcslen(str));//定义长度为5
wcscpy(bstr2.m_str,str);//将宽字符串复制到BSTR中
CComBSTRbstr3(5,OLESTR("HelloWorld"));
CComBSTRbstr4(5,"HelloWorld");
CComBSTRbstr5(OLESTR("Heythere"));
CComBSTRbstr6("Heythere");
CComBSTRbstr7(bstr6);//构造时复制,内容为"Heythere"
_bstr_t是是C++对BSTR的封装,它的构造和析构函数分别调用SysAllocString和SysFreeString函数,其他操作是借用BSTRAPI函数。
与_variant_t相似,使用时也要添加comutil.h和comsupp.lib。
五.BSTR、char*和CString转换
(1)char*转换成CString
若将char*转换成CString,除了直接赋值外,还可使用CString:
:
Format进行。
例如:
charchArray[]="Thisisatest";
char*p="Thisisatest";
或:
LPSTRp="Thisisatest";
或在已定义Unicode应的用程序中:
TCHAR*p=_T("Thisisatest");
或:
LPTSTRp=_T("Thisisatest");
CStringtheString=chArray;
theString.Format(_T("%s"),chArray);
theString=p;
(2)CString转换成char*
若将CString类转换成char*(LPSTR)类型,常常使用下列三种方法:
方法一.使用强制转换。
例如:
CStringtheString("Thisisatest");
LPTSTRlpsz=(LPTSTR)(LPCTSTR)theString;
方法二.使用strcpy。
例如:
CStringtheString("Thisisatest");
LPTSTRlpsz=newTCHAR[theString.GetLength()+1];
_tcscpy(lpsz,theString);
需要说明的是,strcpy(或可移值Unicode/MBCS的_tcscpy)的第二个参数是constwchar_t*(Unicode)或constchar*(ANSI),系统编译器将会自动对其进行转换。
方法三.使用CString:
:
GetBuffer。
例如:
CStrings(_T("Thisisatest"));
LPTSTRp=s.GetBuffer();//在这里添加使用p的代码
if(p!
=NULL)*p=_T('\0');
s.ReleaseBuffer();//使用完后及时释放,以便能使用其它的CString成员函数
(3)BSTR转换成char*
方法一.使用ConvertBSTRToString。
例如:
#include
#pragmacomment(lib,"comsupp.lib")
int_tmain(intargc,_TCHAR*argv[])
{
BSTRbstrText=:
:
SysAllocString(L"Test");
char*lpszText2=_com_util:
:
ConvertBSTRToString(bstrText);
SysFreeString(bstrText);//用完释放
delete[]lpszText2;
return0;
}
方法二.使用_bstr_t的赋值运算符重载。
例如:
_bstr_tb=bstrText;
char*lpszText2=b;
(4)char*转换成BSTR
方法一.使用SysAllocString等API函数。
例如:
BSTRbstrText=:
:
SysAllocString(L"Test");
BSTRbstrText=:
:
SysAllocStringLen(L"Test",4);
BSTRbstrText=:
:
SysAllocStringByteLen("Test",4);
方法二.使用COleVariant或_variant_t。
例如:
//COleVariantstrVar("Thisisatest");
_variant_tstrVar("Thisisatest");
BSTRbstrText=strVar.bstrVal;
方法三.使用_bstr_t,这是一种最简单的方法。
例如:
BSTRbstrText=_bstr_t("Thisisatest");
方法四.使用CComBSTR。
例如:
BSTRbstrText=CComBSTR("Thisisatest");
或CComBSTRbstr("Thisisatest");
BSTRbstrText=bstr.m_str;
方法五.使用ConvertStringToBSTR。
例如:
char*lpszText="Test";
BSTRbstrText=_com_util:
:
ConvertStringToBSTR(lpszText);
(5)CString转换成BSTR
通常是通过使用CStringT:
:
AllocSysString来实现。
例如:
CStringstr("Thisisatest");
BSTRbstrText=str.AllocSysString();
…
SysFreeString(bstrText);//用完释放
(6)BSTR转换成CString
一般可按下列方法进行:
BSTRbstrText=:
:
SysAllocString(L"Test");
CStringAstr;
str.Empty();
str=bstrText;
或CStringAstr(bstrText);
(7)ANSI、Unicode和宽字符之间的转换
方法一.使用MultiByteToWideChar将ANSI字符转换成Unicode字符,使用WideCharToMultiByte将Unicode字符转换成ANSI字符。
方法二.使用“_T”将ANSI转换成“一般”类型字符串,使用“L”将ANSI转换成Unicode,而在托管C++环境中还可使用S将ANSI字符串转换成String*对象。
例如:
TCH
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CStringintstringcharBSTR 之间 转换
![提示](https://static.bdocx.com/images/bang_tan.gif)