VC中BSTR、Char和CString类型的转换
- 格式:doc
- 大小:39.00 KB
- 文档页数:4
转自烧鱼の绯想天#include <string>#include <iostream>using namespace std;void main(void){CString strCString="ABC";char strchar[256],*pstr;pstr=(LPSTR)(LPCTSTR)strCString; //CString---->char*strcpy(strchar,(LPSTR)(LPCTSTR)strCString); //CString---->char[]_bstr_t strbstr=pstr; //char*---->_bstr_tWCHAR *strWCHAR=strbstr; //b_str_t--->UNICODEstrbstr=strWCHAR;pstr=strbstr; //UNICODE---->char*strCString="10";int istr=atoi((LPSTR)(LPCTSTR)strCString); //CString、char[]、char*------>intstrCString.Format("%d",istr); //int----->CStringsprintf(strchar,"%d",istr); //int----->char[]pstr=new char[256]; //字符串申请空间strcpy(pstr,"ABC"); //字符串赋值delete []pstr; //字符串释放string strstring="ABC";pstr=(char*)strstring.c_str(); //string---->char*strCString="2003-10-27 6:24:37"; //CString--->COleDateTimeCOleVariant vtime(strCString);vtime.ChangeType(VT_DATE);COleDateTime time4=vtime;COleDateTime time1(1977,4,16,2,2,2); //COleDataTime--->CTimeSYSTEMTIME systime;VariantTimeToSystemTime(time1, &systime);CTime tm(systime);time_t time2=tm.GetTime(); //CTime--->time_tCOleDateTime time3(time2); //time_t--->COleDateTime//判断字符串是否是某种类型CString sValue("123.1");COleVariant vValue(sValue);BOOL bStrIsFloat = (SUCCEEDED(VariantChangeType(&vValue, &vValue, 0, VT_R8)) && sValue.Find('.') != -1);if(bStrIsFloat){AfxMessageBox("浮点");}}。
_bstr_t与CString相互转换_bstr_t bstr;CString strSql;CString -> _bstr_t: bstr = (_bstr_t)strSql;_bstr_t -> CString: strSql = (LPCSTR)bstr;BSTR宽字符串与CString相互转换BSTR bstr;CString strSql;CString -> BSTR: bstr = strSql.AllocSysString();BSTR -> CString: strSql = (LPCSTR)bstr;1、_variant_t(1)、一般传给这3个指针的值都不是MFC直接支持的数据类型,而要用_variant_t转换一下_variant_t(XX)可以把大多数类型的变量转换成适合的类型传入:(2)、_variant_t var;_variant_t -> long: (long)var;_variant_t -> CString: CString strValue = (LPCSTR)_bstr_t(var);CString -> _variant_t: _variant_t(strSql);CString,int,string,char*之间的转换string 转CStringCString.format("%s", string.c_str());char 转CStringCString.format("%s", char*);char 转stringstring s(char *);string 转char *char *p = string.c_str();CString 转stringstring s(CString.GetBuffer());1,string -> CStringCString.format("%s", string.c_str());用c_str()确实比data()要好.2,char -> stringstring s(char *);你的只能初始化,在不是初始化的地方最好还是用assign().3,CString -> stringstring s(CString.GetBuffer());GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间.《C++标准函数库》中说的有三个函数可以将字符串的内容转换为字符数组和C—string1.data(),返回没有”\0“的字符串数组2,c_str(),返回有”\0“的字符串数组3,copy()CString互转int将字符转换为整数,可以使用atoi、_atoi64或atol。
C++编程之CString、string与、char数组的转换C++编程之CString、string与、char数组的转换虽然⽹上关于CString,string,char数组的转换的⽂章⼀⼤堆,但是感觉很乱很杂,⽽且许多并不能真正达到⽬的,在此,我把⾃⼰调试通过的转换⽅法贴到这⾥,做个笔记。
编译环境:vs2008, Use Unicode Character Set//----------------ANSI字符串转换为UNICODE字符串----------------------//// 待转换的数组char szDCBparam[50] = {'0','1','\0'};// 计算需要的缓冲区⼤⼩DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, szDCBparam, -1, NULL, 0);// 分配存放转换后数据的缓冲区wchar_t *pwText = new wchar_t[dwNum] ;// 转换后的数据存放在pwText所指向的空间if (!MultiByteToWideChar (CP_ACP, 0, szDCBparam, -1, pwText, dwNum)){return;}// 注: 如果是char型数组转CString,直接使⽤CString szTest = CString(szDCBparam);//----------------UNICODE字符串转换为ANSI字符串----------------------////----------------将CString转为char型数组---------------------------//// 待转换的数据CString szErrorInfo = _T("this is a test string!");// 保存错误信息的ANSI字符串的缓冲区,注意,缓冲区要⾜够⼤char InfoString[100];// 转换后的数据存放在InfoString数组中if (!WideCharToMultiByte(CP_ACP,0,LPCTSTR(szErrorInfo),-1,InfoString,100,NULL,NULL)){return;}//----------------将CString转为string----------------------//CString cstr=_T("test");std::string str = (CStringA)cstr;// 注意,在vs2008下,使⽤std::string temp = cstr.GetBuffer(0)不⾏。
1.DWORD型的数据转换成CString型CString str;DWORD dwValue = 121212;str.Format("%d",dwValue)2. CString型转_bstr_tCString strip=”HHHHHE”;_bstr_t pt;Pt= (_bstr_t)stripm_string.SetReadOnly();CString str_data;int len = m_string.LineLength();m_string.GetLine(0,str_data.GetBuffer(len), len);str_data.ReleaseBuffer(len);如果想把编辑框的文本转化为int型,只需调用函数atoi,如下所示:int num = atoi(str_data);则num中保存的就是int型的数据。
3.int转charint senid;for(senid=1;senid<161;senid++)char id[20];sprintf(id, "%d ",senid);strcat(nprocedure_id,(char *)id);4.将CString->char[] char*CString str;Char pp[20];strcpy(pp,str.GetBuffer(0));5.将ltime 转CStringCString strTime;m_CurTime = CTime::GetCurrentTime();strTime = m_CurTime.Format("%Y-%m-%d %H:%M:%S"); 1》string转wstringwstring s2ws(const string& s){_bstr_t t = s.c_str();wchar_t* pwchar = (wchar_t*)t;wstring result = pwchar;return result;}2》wstring转stringstring ws2s(const wstring& ws){_bstr_t t = ws.c_str();char* pchar = (char*)t;string result = pchar;return result;}3》string转cstringa)CString.format("%s", string.c_str());b)CString StringToCString(string str){CString result;for (int i=0;i<(int)str.length();i++){result+=str[i];}return result;}4》cstring转stringa)void ConvertCString2string(CString& strSrc,std::string& strDes) {#ifndef UNICODEstrDes = strSrc;#elseUSES_CONVERSION;strDes = W2A(strSrc.LockBuffer());strSrc.UnlockBuffer();#endif}b)string s(CString.GetBuffer());ReleaseBuffer();GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间. c)string CStringToString(CString cstr){string result(cstr.GetLength(),'e');for (int i=0;i<cstr.GetLength();i++){result[i]=(char)cstr[i];}return result;}5》string转char *a)char *p = string.c_str();举例:string aa("aaa");char *c=aa.c_str();string mngName;char t[200];memset(t,0,200);strcpy(t,mngName.c_str());b)一个一个字符的赋值char *p = new char[sring的长度+1];p[string的长度]='/0';但是要注意最后赋值'/0'!!!char * StringToChar(string &str){int len=str.length();char * p= new char[len+1];for (int i=0;i<len;i++){p[i]=str[i];}p[len]='/0';}6》char* 转stringstring s(char *);你的只能初始化,在不是初始化的地方最好还是用assign();string CharToString(char*arr,int count){string result(arr,4);return result;}string是ansi编码字符charTCHAR是unicode编码字符wchar_t7》string转TCHAR */*wBuf 申明为指针即可。
c语言类型转换顺序C语言类型转换顺序引言:C语言是一种强类型语言,不同类型的数据在进行运算或赋值时需要进行类型转换。
C语言中的类型转换顺序是按照一定规则进行的,本文将介绍C语言中的类型转换顺序及其注意事项。
一、基本数据类型的转换顺序C语言中基本数据类型的转换顺序是按照数据类型的大小进行的,从小到大依次为char、short、int、long、float和double。
在进行运算时,如果参与运算的操作数类型不一致,编译器会自动进行类型转换,将较小的数据类型转换为较大的数据类型。
例如,当一个char类型的变量与一个int类型的变量进行运算时,编译器会将char类型转换为int类型,然后再进行运算。
这是因为int类型的范围比char类型大,可以容纳更多的数值。
二、整型提升在C语言中,当不同的整数类型进行运算时,会发生整型提升。
整型提升是指将较小的整数类型自动转换为较大的整数类型。
例如,当一个short类型的变量与一个int类型的变量进行运算时,编译器会将short类型转换为int类型,然后再进行运算。
这是因为int类型的范围比short类型大,可以容纳更多的数值。
三、浮点数类型的转换浮点数类型的转换顺序与整型类型的转换顺序类似,也是按照数据类型的大小进行的。
从小到大依次为float和double。
在进行运算时,如果参与运算的操作数类型不一致,编译器会自动进行类型转换,将较小的数据类型转换为较大的数据类型。
四、强制类型转换在C语言中,可以使用强制类型转换来显式地将一个数据类型转换为另一个数据类型。
强制类型转换的语法格式为:(type)expression,其中type表示要转换的目标数据类型,expression表示要进行转换的表达式。
需要注意的是,在进行强制类型转换时,可能会导致数据精度丢失或溢出的问题,因此在进行强制类型转换时,需要谨慎使用,确保转换结果的正确性。
五、注意事项在进行类型转换时,需要注意以下几个问题:1. 数据精度丢失:当将一个较大的数据类型转换为较小的数据类型时,可能会导致数据精度丢失。
VC++中各种字符串含义和转换大全2012年 03月 31日整理CString ,BSTR ,LPCTSTR 之间关系和区别CString 是一个动态TCHA 数组,BSTF 是一种专有格式的字符串(需要用系统提 供的函数来操纵,LPCTST 只是一个常量的TCHA 指针。
CStri ng 是一个完全独立的类,动态的TCHA 瞰组,封装了 +等操作符和字符 串操作方法。
typedef OLECHAR FAR* BSTR;typedef Const Char * LPCTSTR;BSTR 是为了与原先的basic 字符兼容。
主要用来和VB 打交道的(VB 里的string 就是指它)。
一个 BSTF 由头部和字符串组成, 头部 4 字节包含串长信息, 串中可以包含嵌入的 nuII 值。
这种带长度前缀的字符串,主要由操作系统来管理的,所以要用api.操作它的API 函数很多, 如 SysAIIocString,SysFreeString 等 .vc 里封装它的类如 _bstr_t ,及 ATL 中的CComBSTR 等.BSTF 是以指针的形式进行传递的。
BSTF 是 Unicode 的,即每个字符需要两个字节。
BSTF 通常以两字节的 nuII 字符结束。
VC++中各种字符串的表示法首先char*是指向ANSI 字符数组的指针,其中每个字符占据 8位(有效数据是 除掉最高位的其他 LP 的含义是长指针 符数组的指针,与 而LPCSTF 中增加的‘ C 的含义是“ CONSTANT (常量),表明这种数据类型的 实例不能被使用它的API 函数改变,除此之外,它与 LPSTR !等同的。
1. LP 表示长指针 , 在 win16 下有长指针 (LP ) 和短指针 (P ) 的区别 , 而在 win32 下是 没有区别的,都是32位.所以这里的LP 和P 是等价的.2. C 表示 Const3. T 是什么东西呢,我们知道TCHAI 在采用Unicode 方式编译时是wchar_t,在普 通时编译成 Char.T 表示在 Win32环境中,有一个_T 宏第一章各种字符串类型的定义、 区别和含义7位),这里保持了与传统的C,C++的兼容。
bstr_t类型到底是类型呢?用的时候也可以直接_bstr_t bstr="abcd";还可以_bstr_t bstr="abcd";CString str=(char *)bstr;//_bstr_t莫非是指针?指针可以赋常量字符串?我在ADO数据库编程中用如下语句:CString str=(m_RecordSet->GetCollect("Name")).bstrV al;//m_RecordSet是_RecordsetPtr类型(m_RecordSet->GetCollect("Name")).bstrV al是BSTR类型说明BSTR可以直接赋给CString类型,从编译器中得知BSTR是unsigned short*类型,怎么可以直接赋给CString对象呢?实在不清楚这三个的本质区别,请高手指点!网友回复:CString str=(char *)bstr;//_bstr_t莫非是指针?指针可以赋常量字符串?\_bstr_t有这几个成员operator const wchar_t*( ) const throw( );operator wchar_t*( ) const throw( );operator const char*( ) const;operator char*( ) const;网友回复:我搜集的资料:May this can help you.7.关于CString和其他一些自动化类型的相互转换问题.未参考的资源: 在各种字符串类型之间进行转换/zh-cn/library/ms235631.aspx类型类别:CString ,V ARIANT,BSTR,_t_btr,等预备知识:BSTR:根据MSDN,他的内部结构为:4字节的长度前缀(字节单位),字符串(宽),2字节结束标志0x0000.平常的BSTR是指向字符串的第一字节,并非前缀.比如定义BSTR myBstr=L”I am a happy BSTR”,这样其实不正确,并没有正确生成前缀.应该这样: BSTR MyBstr = SysAllocString(L"I am a happy BSTR");这样就会在内存分配时就会加上前缀和结束标志.BSTR(Basic STRing,Basic字符串)是一个OLECHAR*类型的Unicode字符串。
VC++中的CString操作指南原文出处:codeproject:CString Management通过阅读本文你可以学习如何有效地使用CString。
CString 是一种很有用的数据类型。
它们很大程度上简化了MFC中的许多操作,使得MFC在做字符串操作的时候方便了很多。
不管怎样,使用CString有很多特殊的技巧,特别是对于纯C背景下走出来的程序员来说有点难以学习。
这篇文章就来讨论这些技巧。
使用CString可以让你对字符串的操作更加直截了当。
这篇文章不是CString的完全手册,但囊括了大部分常见基本问题。
这篇文章包括以下内容:CString 对象的连接格式化字符串(包括int 型转化为CString )CString 型转化成int 型CString 型和char* 类型的相互转化char* 转化成CStringCString 转化成char* 之一:使用LPCTSTR强制转化CString 转化成char* 之二:使用CString对象的GetBuffer方法CString 转化成char* 之三: 和控件的接口CString 型转化成BSTR 型;BSTR 型转化成CString 型;V ARIANT 型转化成CString 型;载入字符串表资源;CString 和临时对象;CString 的效率;总结下面我分别讨论。
1、CString 对象的连接能体现出CString 类型方便性特点的一个方面就字符串的连接,使用CString 类型,你能很方便地连接两个字符串,正如下面的例子:CString gray("Gray");CString cat("Cat");CString graycat = gray + cat;要比用下面的方法好得多:char gray[] = "Gray";char cat[] = "Cat";char * graycat = malloc(strlen(gray) + strlen(cat) + 1);strcpy(graycat, gray);strcat(graycat, cat);2、格式化字符串与其用sprintf() 函数或wsprintf() 函数来格式化一个字符串,还不如用CString 对象的Format()方法:CString s;s.Format(_T("The total is %d"), total);用这种方法的好处是你不用担心用来存放格式化后数据的缓冲区是否足够大,这些工作由CString类替你完成。
VC中BSTR、Char*和CString类型的转换
当我们使用 ActiveX 控件编程时,经常需要用到将某个值表示成BSTR 类型。
BSTR是Basic字符串(Basic String)或二进制字符串(binary string)的缩写,它实际上是一个指向宽字符串指针。
COM为了各语言之间进行字符串传递而产生的一个字符串类型!
适合哪些场合使用呢。
在COM组件的接口上使用,是COM组件字符串的标准传送格式,相当于VB的String类型。
BSTR跟普通字符串还有一个区别就是他的开头保存有该字符串的长度。
1、char*转换成CString
若将char*转换成CString,除了直接赋值外,还可使用CString::format 进行。
例如:
char chArray[] = "This is a test";
char * p = "This is a test";
或
LPSTR p = "This is a test"; 或在已定义Unicode应的用程序中
TCHAR * p = _T("This is a test");
或
LPTSTR p = _T("This is a test");
CString theString = chArray;
theString.format(_T("%s"), chArray);
theString = p;
2、CString转换成char*
若将CString类转换成char*(LPSTR)类型,常常使用下列三种方法:
方法一,使用强制转换。
例如:
CString theString( "This is a test" );
LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString;
方法二,使用strcpy。
例如:
CString theString( "This is a test" );
LPTSTR lpsz = new TCHAR[theString.GetLength()+1];
_tcscpy(lpsz, theString); 需要说明的是,strcpy(或可移值Unicode/MBCS的_tcscpy)的第二个参数是 const wchar_t* (Unicode)或const char* (ANSI),系统编译器将会自动对其进行转换。
方法三,使用CString::GetBuffer。
例如:
CString s(_T("This is a test "));
LPTSTR p = s.GetBuffer();
// 在这里添加使用p的代码
if(p != NULL) *p = _T('\0');
s.ReleaseBuffer(); // 使用完后及时释放,以便能使用其它的CString 成员函数
3、BSTR转换成char*
方法一,使用ConvertBSTRToString。
例如:
#include #pragma comment(lib, "comsupp.lib")
int _tmain(int argc, _TCHAR* argv[])
{
BSTR bstrText = ::SysAllocString(L"Test");
char* lpszText2 = _com_util::ConvertBSTRToString(bstrText); SysFreeString(bstrText); // 用完释放
delete[] lpszText2;
return 0;
}
方法二,使用_bstr_t的赋值运算符重载。
例如:
_bstr_t b = bstrText;
char* lpszText2 = b;
4、char*转换成BSTR
方法一,使用SysAllocString等API函数。
例如:
BSTR bstrText = ::SysAllocString(L"Test");
BSTR bstrText = ::SysAllocStringLen(L"Test",4);
BSTR bstrText = ::SysAllocStringByteLen("Test",4);
方法二,使用COleVariant或_variant_t。
例如:
//COleVariant strVar("This is a test");
_variant_t strVar("This is a test");
BSTR bstrText = strVar.bstrVal;
方法三,使用_bstr_t,这是一种最简单的方法。
例如:
BSTR bstrText = _bstr_t("This is a test"); 方法四,使用CComBSTR。
例如:
BSTR bstrText = CComBSTR("This is a test");
或
CComBSTR bstr("This is a test");
BSTR bstrText = bstr.m_str; 方法五,使用ConvertStringToBSTR。
例如:
char* lpszText = "Test";
BSTR bstrText = _com_util::ConvertStringToBSTR(lpszText);
5、CString转换成BSTR
通常是通过使用CStringT::AllocSysString来实现。
例如:
CString str("This is a test");
BSTR bstrText = str.AllocSysString();
…
SysFreeString(bstrText); // 用完释放
6、BSTR转换成CString
一般可按下列方法进行:
BSTR bstrText = ::SysAllocString(L"Test");
CStringA str;
str.Empty();
str = bstrText;
或
CStringA str(bstrText);
7、ANSI、Unicode和宽字符之间的转换
方法一,使用MultiByteToWideChar将ANSI字符转换成Unicode字符,使用WideCharToMultiByte将Unicode字符转换成ANSI字符。
方法二,使用“_T”将ANSI转换成“一般”类型字符串,使用“L”将ANSI 转换成Unicode,而在托管C++环境中还可使用S将ANSI字符串转换成String*对象。
例如:
TCHAR tstr[] = _T("this is a test");
wchar_t wszStr[] = L"This is a test";
String* str = S”This is a test”;
方法三,使用ATL 7.0的转换宏和类。
ATL7.0在原有3.0基础上完善和增加了许多字符串转换宏以及提供相应的类,它具有如图3所示的统一形式:其中,第一个C表示“类”,以便于ATL 3.0宏相区别,第二个C表示常量,2表示“to”,EX表示要开辟一定大小的缓冲。
SourceType和DestinationType可以是A、T、W和OLE,其含义分别是ANSI、Unicode、“一般”类型和OLE字符串。
例如,CA2CT就是将ANSI转换成一般类型的字符串常量。
下面是一些示例代码:
LPTSTR tstr= CA2TEX<16>("this is a test");
LPCTSTR tcstr= CA2CT("this is a test");
wchar_t wszStr[] = L"This is a test";
char* chstr = CW2A(wszStr);。