C++字符之间的转换整理文档.docx
《C++字符之间的转换整理文档.docx》由会员分享,可在线阅读,更多相关《C++字符之间的转换整理文档.docx(13页珍藏版)》请在冰点文库上搜索。
C++字符之间的转换整理文档
1CString,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转std:
:
string
CStringstr=dlg.GetPathName();
setlocale(LC_ALL,"chs");
char*p=newchar[256];
wcstombs(p,str,256);
m_fileName=p;
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函数。
如
CStrings;
inti=64;
s.Format("%d",i)
Format函数的功能很强,值得你研究一下。
voidCStrDlg:
:
OnButton1()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CString
ss="1212.12";
inttemp=atoi(ss);
Cstringaa;
aa.Format("%d",temp);
AfxMessageBox("varis"+aa);
}
sart.Format("%s",buf);
CString互转char*
///char*TOcstring
CStringstrtest;
char*charpoint;
charpoint="givestringavalue";
strtest=charpoint;
///cstringTOchar*
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));
2CString类型的转换成int
CString类型的转换成int
将字符转换为整数,可以使用atoi、_atoi64或atol。
//CStringaaa="16";
//intint_chage=atoi((lpcstr)aaa);
而将数字转换为CString变量,可以使用CString的Format函数。
如
CStrings;
inti=64;
s.Format("%d",i)
Format函数的功能很强,值得你研究一下。
如果是使用char数组,也可以使用sprintf函数。
//CStringss="1212.12";
//inttemp=atoi(ss);
//CStringaa;
//aa.Format("%d",temp);
数字->字符串除了用CString:
:
Format,还有FormatV、sprintf和不需要借助于Afx的itoa
3char*在装int
#include
intatoi(constchar*nptr);
longatol(constchar*nptr);
longlongatoll(constchar*nptr);
longlongatoq(constchar*nptr);
4CString,int,string,char*之间的转换
stringaa("aaa");
char*c=aa.c_str();
cannotconvertfrom'constchar*'to'char*'
constchar*c=aa.c_str();
5CString,int,string,char*之间的转换
string.c_str()只能转换成constchar*,
要转成char*这样写:
stringmngName;
chart[200];memset(t,0,200);strcpy(t,mngName.c_str())
一:
char转unsignedchar
char*s="cbc";
unsignedchar*ptr=(unsignedchar*)s;
unsignedcharp=s[0];
刚接触VC编程的朋友往往对许多数据类型的转换感到迷惑不解,本文将介绍一些常用数据类型的使用。
我们先定义一些常见类型变量借以说明
inti=100;longl=2001;floatf=300.2;doubled=12345.119;charusername[]="女侠程佩君";chartemp[200];char*buf;CStringstr;_variant_tv1;_bstr_tv2;
一、其它数据类型转换为字符串
短整型(int)
itoa(i,temp,10);///将i转换为字符串放入temp中,最后一个数字表示十进制
itoa(i,temp,2);///按二进制方式转换
itoa(i,temp,8);///按八进制方式转换
itoa(i,temp,16);///按十六进制方式转换
长整型(long)
ltoa(l,temp,10);
(__int64)
CStringstr=m_edit1,str1;
__int64nTemp=_atoi64(str);
charbuffer[60]={0};
_i64toa(nTemp,buffer,16);
str1=buffer;
二、从其它包含字符串的变量中获取指向该字符串的指针
CString变量
str="2008北京奥运";
buf=(LPSTR)(LPCTSTR)str;
BSTR类型的_variant_t变量
v1=(_bstr_t)"程序员";
buf=_com_util:
:
ConvertBSTRToString((_bstr_t)v1);
三、字符串转换为其它数据类型
strcpy(temp,"123");
短整型(int)
i=atoi(temp);
长整型(long)
l=atol(temp);
浮点(double)
d=atof(temp);
四、其它数据类型转换到CString
使用CString的成员函数Format来转换,例如:
整数(int)
str.Format("%d",i);
浮点数(float)
str.Format("%f",i);
字符串指针(char*)等已经被CString构造函数支持的数据类型可以直接赋值
str=username;
五、BSTR、_bstr_t与CComBSTR
CComBSTR、_bstr_t是对BSTR的封装,BSTR是指向字符串的32位指针。
char*转换到BSTR可以这样:
BSTRb=_com_util:
:
ConvertStringToBSTR("数据");///使用前需要加上头文件comutil.h
反之可以使用char*p=_com_util:
:
ConvertBSTRToString(b);
六、VARIANT、_variant_t与COleVariant
VARIANT的结构可以参考头文件VC98\Include\OAIDL.H中关于结构体tagVARIANT的定义。
对于VARIANT变量的赋值:
首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子:
VARIANTva;
inta=2001;
va.vt=VT_I4;///指明整型数据
va.lVal=a;///赋值
对于不马上赋值的VARIANT,最好先用VoidVariantInit(VARIANTARGFAR*pvarg);进行初始化,其本质是将vt设置为VT_EMPTY,下表我们列举vt与常用数据的对应关系:
unsignedcharbVal;VT_UI1
shortiVal;VT_I2
longlVal;VT_I4
floatfltVal;VT_R4
doubledblVal;VT_R8
VARIANT_BOOLboolVal;VT_BOOL
SCODEscode;VT_ERROR
CYcyVal;VT_CY
DATEdate;VT_DATE
BSTRbstrVal;VT_BSTR
IUnknownFAR*punkVal;VT_UNKNOWN
IDispatchFAR*pdispVal;VT_DISPATCH
SAFEARRAYFAR*parray;VT_ARRAY|*
unsignedcharFAR*pbVal;VT_BYREF|VT_UI1
shortFAR*piVal;VT_BYREF|VT_I2
longFAR*plVal;VT_BYREF|VT_I4
floatFAR*pfltVal;VT_BYREF|VT_R4
doubleFAR*pdblVal;VT_BYREF|VT_R8
VARIANT_BOOLFAR*pboolVal;VT_BYREF|VT_BOOL
SCODEFAR*pscode;VT_BYREF|VT_ERROR
CYFAR*pcyVal;VT_BYREF|VT_CY
DATEFAR*pdate;VT_BYREF|VT_DATE
BSTRFAR*pbstrVal;VT_BYREF|VT_BSTR
IUnknownFAR*FAR*ppunkVal;VT_BYREF|VT_UNKNOWN
IDispatchFAR*FAR*ppdispVal;VT_BYREF|VT_DISPATCH
SAFEARRAYFAR*FAR*pparray;VT_ARRAY|*
VARIANTFAR*pvarVal;VT_BYREF|VT_VARIANT
voidFAR*byref;VT_BYREF
_variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。
例如:
longl=222;
ingi=100;
_variant_tlVal(l);
lVal=(long)i;
COleVariant的使用与_variant_t的方法基本一样,请参考如下例子:
COleVariantv3="字符串",v4=(long)1999;
CStringstr=(BSTR)v3.pbstrVal;
longi=v4.lVal;
七、其它
五、VARIANT、_variant_t与COleVariant
VARIANT的结构可以参考头文件VC98\Include\OAIDL.H中关于结构体tagVARIANT的定义。
对于VARIANT变量的赋值:
首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子:
VARIANTva;
inta=2001;
va.vt=VT_I4;///指明整型数据
va.lVal=a;///赋值
对于不马上赋值的VARIANT,最好先用VoidVariantInit(VARIANTARGFAR*pvarg);进行初始化,其本质是将vt设置为VT_EMPTY,下表我们列举vt与常用数据的对应关系:
BytebVal;//VT_UI1.
ShortiVal;//VT_I2.
longlVal;//VT_I4.
floatfltVal;//VT_R4.
doubledblVal;//VT_R8.
VARIANT_BOOLboolVal;//VT_BOOL.
SCODEscode;//VT_ERROR.
CYcyVal;//VT_CY.
DATEdate;//VT_DATE.
BSTRbstrVal;//VT_BSTR.
DECIMALFAR*pdecVal//VT_BYREF|VT_DECIMAL.
IUnknownFAR*punkVal;//VT_UNKNOWN.
IDispatchFAR*pdispVal;//VT_DISPATCH.
SAFEARRAYFAR*parray;//VT_ARRAY|*.
ByteFAR*pbVal;//VT_BYREF|VT_UI1.
shortFAR*piVal;//VT_BYREF|VT_I2.
longFAR*plVal;//VT_BYREF|VT_I4.
floatFAR*pfltVal;//VT_BYREF|VT_R4.
doubleFAR*pdblVal;//VT_BYREF|VT_R8.
VARIANT_BOOLFAR*pboolVal;//VT_BYREF|VT_BOOL.
SCODEFAR*pscode;//VT_BYREF|VT_ERROR.
CYFAR*pcyVal;//VT_BYREF|VT_CY.
DATEFAR*pdate;//VT_BYREF|VT_DATE.
BSTRFAR*pbstrVal;//VT_BYREF|VT_BSTR.
IUnknownFAR*FAR*ppunkVal;//VT_BYREF|VT_UNKNOWN.
IDispatchFAR*FAR*ppdispVal;//VT_BYREF|VT_DISPATCH.
SAFEARRAYFAR*FAR*pparray;//VT_ARRAY|*.
VARIANTFAR*pvarVal;//VT_BYREF|VT_VARIANT.
voidFAR*byref;//GenericByRef.
charcVal;//VT_I1.
unsignedshortuiVal;//VT_UI2.
unsignedlongulVal;//VT_UI4.
intintVal;//VT_INT.
unsignedintuintVal;//VT_UINT.
charFAR*pcVal;//VT_BYREF|VT_I1.
unsignedshortFAR*puiVal;//VT_BYREF|VT_UI2.
unsignedlongFAR*pulVal;//VT_BYREF|VT_UI4.
intFAR*pintVal;//VT_BYREF|VT_INT.
unsignedintFAR*puintVal;//VT_BYREF|VT_UINT.
_variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。
使用时需加上#include
例如:
longl=222;
ingi=100;
_variant_tlVal(l);
lVal=(long)i;
COleVariant的使用与_variant_t的方法基本一样,请参考如下例子:
COleVariantv3="字符串",v4=(long)1999;
CStringstr=(BSTR)v3.pbstrVal;
longi=v4.lVal;
六、其它一些COM数据类型
根据ProgID得到CLSID
HRESULTCLSIDFromProgID(LPCOLESTRlpszProgID,LPCLSIDpclsid);
CLSIDclsid;
CLSIDFromProgID(L"MAPI.Folder",&clsid);
根据CLSID得到ProgID
WINOLEAPIProgIDFromCLSID(REFCLSIDclsid,LPOLESTR*lplpszProgID);
例如我们已经定义了CLSID_IApplication,下面的代码得到ProgID
LPOLESTRpProgID=0;
ProgIDFromCLSID(CLSID_IApplication,&pProgID);
...///可以使用pProgID
CoTaskMemFree(pProgID);//不要忘记释放
七、ANSI与Unicode
Unicode称为宽字符型字串,COM里使用的都是Unicode字符串。
将ANSI转换到Unicode
(1)通过L这个宏来实现,例如:
CLSIDFromProgID(L"MAPI.Folder",&clsid);
(2)通过MultiByteToWideChar函数实现转换,例如:
char*szProgID="MAPI.Folder";
WCHARszWideProgID[128];
CLSIDclsid;
longlLen=MultiByteToWideChar(CP_ACP,0,szProgID,strlen(szProgID),szWideProgID,sizeof(szWideProgID));
szWideProgID[lLen]='\0';
(3)通过A2W宏来实现,例如:
USES_CONVERSION;
CLSIDFromProgID(A2W(szProgID),&clsid);
将Unicode转换到ANSI
(1)使用WideCharToMultiByte,例如:
//假设已经有了一个Unicode串wszSomeString...
charszANSIString[MAX_PATH];
WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,wszSomeString,-1,szANSIString,sizeof(szANSIString),NULL,NULL);
(2)使用W2A宏来实现,例如:
USES_CONVERSION;
pTemp=W2A(wszSomeString);
八、其它
对消息的处理中我们经常需要将WPARAM或LPARAM等32位数据(DWORD)分解成两个16位数据(WORD),例如:
LPARAMlParam;
WORDloValue=LOWORD(lParam);///取低16位
WORDhiValue=HIWORD(lParam);///取高16位
对于16位的数据(WORD)我们可以用同样的方法分解成高低两个8位数据(BYTE),例如:
WORDwValue;
BYTEloValue=LOBYTE(wValue);///取低8位
BYTEhiValue=HIBYTE(wValue);///取高8位
两个16位数据(WORD)合成32位数据(DWORD,LRESULT,LPARAM,或WPARAM)
LONGMAKELONG(WORDwLow,WORDwHigh);
WPARAMMAKEWPARAM(WORDwLow,WORDwHigh);
LPARAMMAKELPARAM(WORDwLow,WORDwHigh);
LRESULTMAKELRESULT(WORDwLow,WORDwHigh);
两个8位的数据(BYTE)合成16位的数据(WORD)
WORDMAKEWORD(BYTEbLow,BYTEbHigh);
从R(red),G(green),B(blue)三色得到COLORREF类型的颜色值
COLORREFRGB(BYTEbyRed,BYTEbyGreen,BYTEbyBlue);
例如COLORREFbkcolor=RGB(0x22,0x98,0x34);
从COLORREF类型的颜色值得到RGB三个颜色值
BYTERed=GetRValue(bkcolor);///得到红颜色
BYTEGreen=GetGValue(bkcolor);///得到绿颜色
BYTEBlue=GetBValue(bkcolor);///得到兰颜色
九、注意事项
假如需要使用到ConvertBSTRToString此类函数,需要加上头文件comutil.h,并在setting中加入comsupp.lib或者直接加上#pragmacomment(lib,"comsupp.lib")