《2022年常见的类型转换 .pdf》由会员分享,可在线阅读,更多相关《2022年常见的类型转换 .pdf(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、常用数据类型使用转换详解先定义一些常见类型变量借以说明int i = 100; long l = 2001; float f=300.2; double d=12345.119; char username=女侠程佩君 ; char temp200; char *buf; CString str; _variant_t v1; _bstr_t v2; 一、其它数据类型转换为字符串短整型 (int) itoa(i,temp,10); / 将 i 转换为字符串放入temp中,最后一个数字表示十进制itoa(i,temp,2); / 按二进制方式转换长整型 (long) ltoa(l,temp,10
2、); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 14 页 - - - - - - - - - 二、从其它包含字符串的变量中获取指向该字符串的指针CString变量str = 2008北京奥运 ; buf = (LPSTR)(LPCTSTR)str; BSTR 类型的 _variant_t变量v1 = (_bstr_t)程序员 ; buf = _com_util:ConvertBSTRToString(_bstr_t)v1); 三、字符串转换为其它数据类型strcpy
3、(temp,123); 短整型 (int) i = atoi(temp); 长整型 (long) l = atol(temp); 浮点(double) d = atof(temp); 四、其它数据类型转换到CString 使用 CString的成员函数Format来转换 ,例如 : 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 14 页 - - - - - - - - - 整数(int) str.Format(%d,i); 浮点数 (float) str.Format(
4、%f,i); 字符串指针 (char *)等已经被CString构造函数支持的数据类型可以直接赋值str = username; 五、BSTR 、_bstr_t与 CComBSTR CComBSTR 、_bstr_t是对 BSTR 的封装 ,BSTR 是指向字符串的32 位指针。char *转换到 BSTR 可以这样 : BSTR b=_com_util:ConvertStringToBSTR(数据 ); / 使用前需要加上头文件comutil.h 反之可以使用char *p=_com_util:ConvertBSTRToString(b); 六、VARIANT 、_variant_t 与 C
5、OleVariant VARIANT的结构可以参考头文件VC98IncludeOAIDL.H中关于结构体tagVARIANT的定义。对于 VARIANT变量的赋值:首先给vt 成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子:VARIANT va; int a=2001; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 14 页 - - - - - - - - - va.vt=VT_I4; / 指明整型数据va.lVal=a; / 赋值对于不马上赋值
6、的VARIANT ,最好先用Void VariantInit(VARIANTARG FAR* pvarg);进行初始化 ,其本质是将vt 设置为 VT_EMPTY, 下表我们列举vt 与常用数据的对应关系 : unsigned char bVal; VT_UI1 short iVal; VT_I2 long lVal; VT_I4 float fltVal; VT_R4 double dblVal; VT_R8 VARIANT_BOOL boolVal; VT_BOOL SCODE scode; VT_ERROR CY cyVal; VT_CY DATE date; VT_DATE BSTR
7、bstrVal; VT_BSTR IUnknown FAR* punkVal; VT_UNKNOWN IDispatch FAR* pdispVal; VT_DISPATCH SAFEARRAY FAR* parray; VT_ARRAY|* 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 14 页 - - - - - - - - - unsigned char FAR* pbVal; VT_BYREF|VT_UI1 short FAR* piVal; VT_BYREF|
8、VT_I2 long FAR* plVal; VT_BYREF|VT_I4 float FAR* pfltVal; VT_BYREF|VT_R4 double FAR* pdblVal; VT_BYREF|VT_R8 VARIANT_BOOL FAR* pboolVal; VT_BYREF|VT_BOOL SCODE FAR* pscode; VT_BYREF|VT_ERROR CY FAR* pcyVal; VT_BYREF|VT_CY DATE FAR* pdate; VT_BYREF|VT_DATE BSTR FAR* pbstrVal; VT_BYREF|VT_BSTR IUnknow
9、n FAR* FAR* ppunkVal; VT_BYREF|VT_UNKNOWN IDispatch FAR* FAR* ppdispVal; VT_BYREF|VT_DISPATCH SAFEARRAY FAR* FAR* pparray; VT_ARRAY|* VARIANT FAR* pvarVal; VT_BYREF|VT_VARIANT void FAR* byref; VT_BYREF _variant_t是 VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - -
10、- - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 14 页 - - - - - - - - - 例如:long l=222; ing i=100; _variant_t lVal(l); lVal = (long)i; COleVariant的使用与 _variant_t的方法基本一样,请参考如下例子:COleVariant v3 = 字符串 , v4 = (long)1999; CString str =(BSTR)v3.pbstrVal; long i = v4.lVal; 七、其它对消息的处理中我们经常需要将WPARAM 或 LPARAM 等 32 位
11、数据 (DWORD)分解成两个 16 位数据 (WORD),例如:LPARAM lParam; WORD loValue = LOWORD(lParam); / 取低 16 位WORD hiValue = HIWORD(lParam); / 取高 16 位对于 16 位的数据 (WORD) 我们可以用同样的方法分解成高低两个8 位数据 (BYTE),例如 : WORD wValue; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 14 页 - - - - - - - -
12、 - BYTE loValue = LOBYTE(wValue); / 取低 8 位BYTE hiValue = HIBYTE(wValue); / 取高 8 位如何将 CString类型的变量赋给char* 类型的变量1、GetBuffer函数:使用 CString:GetBuffer函数。char *p; CString str=hello; p=str.GetBuffer(str.GetLength(); str.ReleaseBuffer(); 将 CString转换成 char * 时CString str(aaaaaaa); strcpy(str.GetBuffer(10),aa)
13、; str.ReleaseBuffer(); 当我们需要字符数组时调用GetBuffer(int n),其中 n 为我们需要的字符数组的长度.使用完成后一定要马上调用ReleaseBuffer(); 还有很重要的一点就是,在能使用 const char *的地方 ,就不要使用char * 2、memcpy:CString mCS=_T(cxl); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 14 页 - - - - - - - - - char mch20; memc
14、py(mch,mCS,20); 3、用 LPCTSTR 强制转换:尽量不使用char *ch; CString str; ch=(LPSTR)(LPCTSTR)str; CString str = good; char *tmp; sprintf(tmp,%s,(LPTSTR)(LPCTSTR)str); 4、CString Msg; Msg=Msg+abc; LPTSTR lpsz; lpsz = new TCHARMsg.GetLength()+1; _tcscpy(lpsz, Msg); char * psz; strcpy(psz,lpsz); 名师资料总结 - - -精品资料欢迎下载
15、 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 14 页 - - - - - - - - - CString类向 const char *转换char a100; CString str(aaaaaa); strncpy(a,(LPCTSTR)str,sizeof(a); 或者如下 : strncpy(a,str,sizeof(a); 以上两种用法都是正确地. 因为 strncpy的第二个参数类型为const char *.所以编译器会自动将CString类转换成 const char *. CString转
16、LPCTSTR (const char *) CString cStr; const char *lpctStr=(LPCTSTR)cStr; LPCTSTR 转 CString LPCTSTR lpctStr; CString cStr=lpctStr; 将 char* 类型的变量赋给CString型的变量可以直接赋值,如:CString myString = This is a test; 也可以利用构造函数,如:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 14
17、页 - - - - - - - - - CString s1(Tom); 将 CString类型的变量赋给char 类型 ( 字符串 ) 的变量1、sprintf()函数CString str = good; char tmp200 ; sprintf(tmp, %s,(LPCSTR)str); (LPCSTR)str这种强制转换相当于(LPTSTR)(LPCTSTR)str CString类的变量需要转换为(char*)的时 ,使用 (LPTSTR)(LPCTSTR)str 然而, LPCTSTR 是 const char *,也就是说,得到的字符串是不可写的!将其强制转换成 LPTSTR
18、去掉 const ,是极为危险的!一不留神就会完蛋! 要得到 char *,应该用 GetBuffer()或 GetBufferSetLength(),用完后再调用ReleaseBuffer()。2、strcpy()函数CString str; char c256; strcpy(c, str); char mychar1024; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 14 页 - - - - - - - - - CString source=Hello; s
19、trcpy(char*)&mychar,(LPCTSTR)source); 关于 CString的使用1、指定CString 形参对于大多数需要字符串参数的函数,最好将函数原型中的形参指定为一个指向字符(LPCTSTR) 而非CString 的 const 指针。当将形参指定为指向字符的const 指针时, 可将指针传递到TCHAR 数组(如字符串 hi there)或传递到CString 对象。CString 对象将自动转换成LPCTSTR 。任何能够使用LPCTSTR 的地方也能够使用 CString 对象。2、如果某个形参将不会被修改,则也将该参数指定为常数字符串引用(即const CS
20、tring&)。如果函数要修改该字符串,则删除const 修饰符。如果需要默认为空值,则将其初始化为空字符串,如下所示:void AddCustomer( const CString& name, const CString& address, const CString& comment = ); 3、对于大多数函数结果,按值返回CString 对象即可。串的基本运算对于串的基本运算,很多高级语言均提供了相应的运算符或标准的库函数来实现。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - -
21、第 11 页,共 14 页 - - - - - - - - - 为叙述方便,先定义几个相关的变量:char s120=dir/bin/appl,s220=file.asm,s330,*p; int result; 下面以 C 语言中串运算介绍串的基本运算1、求串长int strlen(char *s); / 求串 s 的长度【例】 printf(%d,strlen(s1); / 输出 s1 的串长 12 2、串复制char *strcpy(char *to,*from);/ 将 from串复制到 to 串中,并返回to 开始处指针【例】 strcpy(s3,s1); /s3=dir/bin/a
22、ppl,s1串不变3、联接char *strcat(char *to,char *from);/将 from串复制到 to 串的末尾,/ 并返回 to 串开始处的指针【例】 strcat(s3,/); /s3=dir/bin/appl/ strcat(s3,s2); /s3=dir/bin/appl/file.asm 4、串比较int strcmp(char *s1,char *s2);/比较 s1 和 s2 的大小,名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 14
23、 页 - - - - - - - - - / 当 s1s2 和 s1=s2时,分别返回小于0、大于 0 和等于 0 的值【例】 result=strcmp(baker,Baker); /result0 result=strcmp(12,12); /result=0 result=strcmp(Joe,joseph) /result0 5、字符定位char *strchr(char *s,char c);/找 c 在字符串 s 中第一次出现的位置,/ 若找到,则返回该位置,否则返回NULL 【例】 p=strchr(s2,.); /p指向 file 之后的位置if(p) strcpy(p,.cp
24、p); /s2=file.cpp 注意:上述操作是最基本的,其中后4 个操作还有变种形式:strncpy,strncath和strnchr 。其它的串操作见C 的。在不同的高级语言中,对串运算的种类及符号都不尽相同其余的串操作一般可由这些基本操作组合而成【例】求子串的操作可如下实现:void substr(char *sub,char *s,int pos,int len) /s 和 sub 是字符数组,用sub 返回串 s 的第 pos 个字符起长度为len 的子串/ 其中 0=pos=strlen(s)-1,且数组 sub 至少可容纳len+1个字符。名师资料总结 - - -精品资料欢迎下
25、载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 14 页 - - - - - - - - - if (posstrlen(s)-1|len0) Error(parameter error!); strncpy(sub,&spos,len); / 从 spos起复制至多 len 个字符到 sub 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 14 页 - - - - - - - - -