C++字符之间的转换整理文档.docx

上传人:b****5 文档编号:14609174 上传时间:2023-06-25 格式:DOCX 页数:13 大小:19.30KB
下载 相关 举报
C++字符之间的转换整理文档.docx_第1页
第1页 / 共13页
C++字符之间的转换整理文档.docx_第2页
第2页 / 共13页
C++字符之间的转换整理文档.docx_第3页
第3页 / 共13页
C++字符之间的转换整理文档.docx_第4页
第4页 / 共13页
C++字符之间的转换整理文档.docx_第5页
第5页 / 共13页
C++字符之间的转换整理文档.docx_第6页
第6页 / 共13页
C++字符之间的转换整理文档.docx_第7页
第7页 / 共13页
C++字符之间的转换整理文档.docx_第8页
第8页 / 共13页
C++字符之间的转换整理文档.docx_第9页
第9页 / 共13页
C++字符之间的转换整理文档.docx_第10页
第10页 / 共13页
C++字符之间的转换整理文档.docx_第11页
第11页 / 共13页
C++字符之间的转换整理文档.docx_第12页
第12页 / 共13页
C++字符之间的转换整理文档.docx_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

C++字符之间的转换整理文档.docx

《C++字符之间的转换整理文档.docx》由会员分享,可在线阅读,更多相关《C++字符之间的转换整理文档.docx(13页珍藏版)》请在冰点文库上搜索。

C++字符之间的转换整理文档.docx

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")

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2