




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、VC+常用数据类型及其操作详解西安邮电学院计算机系徐兆元(FLxyzsby FLxyzsby)2004/08/03目录一. VC常用数据类型列表二. 常用数据类型转化2.1数学类型变量与字符串相互转换2.2 CString及string,char *与其他数据类型的转换和操作CString,string,char* 的综合比较数学类型与CString相互转化CString与char*相互转换举例CString与BSTR型转换VARIANT型转化成 CString型2.3 BSTR、_bstr_t 与 CComBSTR2.4 VARIANT 、_variant_t 与 COleVariant附录
2、CString及字符串转及操作详解 参考书籍:CSDN,<<MFC 深入浅出(Second Edit)>>VC常用数据类型列表TypeDefault SizeDescription基础 类 型全疋小写说明:这些基础数据类型对于 MFC还是API都是被支持的boolea nun sig ned 8 bit ,取值 TRUE/FALSEbyteun sig ned 8 bit,整数,输岀按字符输岀charun sig ned 8 bit,字符doublesigned 64 bit浮点型floatsigned32 bit浮点型han dle tPrimitive handle
3、 typehypersigned 64 bit整型intsigned 32 bit整型longsigned 32 bit整型shortsig ned 16 bit整型smallsig ned 8 bit整型void *32-bit指向未知类型的指针wchar_tun sig ned 16 bit16位字符,比char可容纳更多的字符Win32说明:这些 Win32API支持的简单数据类型主要是用来定义函数返回值,消息参数,结构成员。API这类数据类型大致可以分为五大类:字符型、布尔型、整型、指针型和句柄型(?).总共大概有常100多种不同的类型,用BOOL/BOOLEAN8bit,TRUE/F
4、ALSE布尔型数BYTEun sig ned 8 bit据BSTR32 bitBSTR是指向字符串的32位指针类CComBSTR是对BSTR的封装型bstr t是对BSTR的封装CHAR8 bit(ANSI )字符类型全COLORREF32 bitRGB颜色值整型大DWORDun sig ned 32 bit整型写FLOATfloat 型float 型HANDLEObject句柄HBITMAPbitmap句柄HBRUSHbrush句柄HCURSORcursor句柄HDC设备上下文句柄HFILEOpenFile打开的File句柄HFONTfont句柄HHOOKhook句柄HKEY注册表键句柄HP
5、ENpen句柄HWNDwindow句柄INTLONGLONGLONG64位带符号整型LPARAM32 bit消息参数LPBOOLBOOL型指针LPBYTEBYTE型指针LPCOLOREFCOLORREF型指针LPCSTR/LPSTR/PCSTR指向8位(ANSI )字符串类型指针LPCWSTR/LPWSTR/PCWSTR指向16位Unicode字符串类型LPCTSTR/LPTSTR/PCTSTR指向一 8位或16位字符串类型指针LPVOID指向一个未指定类型的 32位指针LPDWORD指向一个DWORD型指针其他相似类型:LPHANDLE、LPINT、LPLONG、LPWORD、LPRESUL
6、TPBOOL、PBOOLEAN、PBYTE、PCHAR、PDWORD、PFLOAT、PHANDLE、PINT、PLONG、PSHORT,说明:(1)在16位系统中LP为16bit,P为8bit,在32位系统中都是32bit(此时等价)LPCSTR等 中的C指Const,T表示TCHAR模式即可以工作在 ANSI下也可UNICODESHORTusig ned整型其他 UCHAR、UINT、ULONG、ULONGLONG、USHORT 为无符号相应类型TBYTEWCHAR型或者 CHAR型TCHARANSI 与 unicode 均可VARIANT_variant_tCOleVariant一个结构体
7、参考 OAIDL.H_variant_t 是 VARIANT 的封装类COleVariant也是VARIANT的封装类WNDPROC指向一个窗口过程的32位指针WCHAR16位Unicode字符型WORD16位无符号整型WPARAM消息参数MFC独有 数据 类型下面两个数据类型是微软基础类库中独有的数据类型POSITION标记集合中一个元素的位置的值,被MFC中的集合类所使用LPCRECT指向一个RECT结构体常量(不能修改)的 32位指针CStri ng其实是MFC中的一个类说明:(1) 表示省略(2) 1Byte=8Bit,字与机器有关,在8位系统中:字=1字节,16位系统中,1字=2字节
8、,32位中:1字=4字节, 64位中1字=8字节不要搞混这些概念.常用数据类型转化及操作2. 1数学类型变量与字符串相互转换(这些函数都在 STDLIB.H里)(1)将数学类型转换为字符串可以用以下一些函数:举例:_CRTIMP char * _cdecl _itoa(int, char *, int); 这是一个将数字转换为一个字符串类型的函数最后一个int表示转换的进制如以下程序int iTyep=3;char *szChar;itoa(iType,szChar,2); cout<<szChar;/ 输出为 1010 类似函数列表 :_CRTIMP char * _cdecl
9、_itoa(int, char *, int);/ 为了完整性 ,也列在其中_CRTIMP char * _cdecl _ultoa(unsigned long, char *, int);_CRTIMP char * _cdecl _ltoa(long, char *, int);_CRTIMP char * _cdecl _i64toa(_int64, char *, int);_CRTIMP char * _cdecl _ui64toa(unsigned _int64, char *, int);_CRTIMP wchar_t * _cdecl _i64tow(_int64, wchar
10、_t *, int);_CRTIMP wchar_t * _cdecl _ui64tow(unsigned _int64, wchar_t *, int);_CRTIMP wchar_t * _cdecl _itow (int, wchar_t *, int);/ 转换为长字符串类型_CRTIMP wchar_t * _cdecl _ltow (long, wchar_t *, int);_CRTIMP wchar_t * _cdecl _ultow (unsigned long, wchar_t *, int); 还有很多 ,请自行研究 2)将字符串类型转换为数学类型变量可以用以下一些函数:
11、举例 : _CRTIMP int _cdecl atoi(const char *);/ 参数一看就很明了 char *szChar= ” 88 ”;int temp(0); temp=atoi(szChar);cout<<temp; 类似的函数列表 :_CRTIMP int_cdecl atoi(const char *);_CRTIMP double _cdecl atof(const char *);_CRTIMP long _cdecl atol(const char *);_CRTIMP long double _cdecl _atold(const char *);_C
12、RTIMP _int64 _cdecl _atoi64(const char *);_CRTIMP double _cdecl strtod(const char *, char *);/_CRTIMP long _cdecl strtol(const char *, char *, int);/_CRTIMP long double _cdecl _strtold(const char *, char *);_CRTIMP unsigned long _cdecl strtoul(const char *, char *, int);_CRTIMP double _cdecl wcstod(
13、const wchar_t *, wchar_t *);/ 长字符串类型转换为数学类型 _CRTIMP long _cdecl wcstol(const wchar_t *, wchar_t *, int);_CRTIMP unsigned long _cdecl wcstoul(const wchar_t *, wchar_t *, int); _CRTIMP int _cdecl _wtoi(const wchar_t *);_CRTIMP long _cdecl _wtol(const wchar_t *);_CRTIMP _int64 _cdecl _wtoi64(const wcha
14、r_t *); 还有很多 ,请自行研究2. 2. CString及string,char *与其他数据类型的转换和操作(1) CString,string,char*的综合比较(这部分 CSDN上的作者joise的文章<< CString,string,char*的综合比较 >>写的很详细,请大家在仔细阅读他的文章.地址:或参考附录:转换:数学类型与CString相互转化数学类型转化为CStri ng可用Format函数,举例:CStri ng s;int i = 64;s.Format("%d", i)CString转换为数学类型:举例CStri
15、ng strValue("1.234");double dblValue;dblValue = atof(LPCTSTR)strValue);CString与char*相互转换举例CString strValue( “ Hello ; ”)char *szValue;szValue=strValue.GetBuffer(szValue);也可用(LPSTR)(LPCTSTR)对CString进行强制转换.szValue=(LPSTR)(LPCTSTR)strValue;反过来可直接赋值:char *szChar=NULL;CStri ng strValue;szChar=
16、new char10;memset(szChar,0,10);strcpy(szChar, ” Hello ” );strValue=szChar;CString与BSTR型转换CString型转化成 BSTR型当我们使用 ActiveX 控件编程时,经常需要用到将某个值表示成BSTR类型.BSTR是一种记数字符串,In tel平台上的宽字符串 (Uni code),并且可以包含嵌入的 NULL 字符。可以调用 CString对象的 AllocSysString 方法将 CString转化成 BSTR:CStri ng str;str = ; / whateverBSTR bStr = str
17、.AllocSysString();BSTR 型转换为 CString如果你在 UNICODE 模式下编译代码,你可以简单地写成:CString convert(BSTR bStr)if(bStr = NULL)return CString(_T("");CString s(bStr); / in UNICODE modereturn s;如果是 ANSI 模式CString convert(BSTR b)CString s;if(b = NULL)return s; / empty for NULL BSTR#ifdef UNICODEs = b;#elseLPSTR p
18、 = s.GetBuffer(SysStringLen(b) + 1);/ ANSI Code Page/ no flags/ source widechar string/ assume NUL-terminated/ target buffer:WideCharToMultiByte(CP_ACP,0,b,-1,p,SysStringLen(b)+1, / target buffer length/ use system default char / don''t care if default usedNULL, NULL);s.ReleaseBuffer();#endi
19、freturn s;VARIANT 型转化成 CString 型VARIANT 类型经常用来给 COM 对象传递参数, 或者接收从 COM 对象返回的值。 你也能自己编写返回 VARIANT 类型的方法,函数返回什么类型 依赖可能(并且常常)方法的输入参数 (比如,在自动化操作中, 依赖与你调用哪个方法。 IDispatch:Invoke 可能返回 (通过其一个参数) 一个 包含有 BYTE 、WORD 、float 、double、date、BSTR 等等 VARIANT 类型的结果, (详见 MSDN 上的 VARIANT 结构的定义) 。在下面 的例子中, 假设 类型是一个 BSTR 的
20、变体, 也就是说在串中的值是通过 bsrtVal 来引 用,其优点是在 ANSI 应用中,有一个构造函数会把 LPCWCHAR 引用的值转换为 一个 CString (见 BSTR-to-CString 部分)。在 Unicode模式中,将成为标准的CString构造函数, 参见对缺省 :WideCharToMultiByte 转换的告诫, 以及你觉得是否可以接受 (大多数情况下,你会满意的) 。 VARIANT vaData;vaData = m_com.YourMethodHere();ASSERT(vaData.vt = VT_BSTR);CString strData(vaData.b
21、strVal);你还可以根据 vt 域的不同来建立更通用的转换例程。为此你可能会考虑:CString VariantToString(V ARIANT * va)CString s;switch(va->vt) /* vt */case VT_BSTR:return CString(vaData->bstrVal);case VT_BSTR | VT_BYREF:return CString(*vaData->pbstrVal);case VT_I4:s.Format(_T("%d"), va->lVal);return s;case VT_I4 |
22、 VT_BYREF:s.Format(_T("%d"), *va->plVal);case VT_R8:s.Format(_T("%f"), va->dblVal);return s;. 剩下的类型转换由读者自己完成default:ASSERT(FALSE); / unknown V ARIANT type (this ASSERT is optional) return CString(""); /* vt */23 BSTR 、_bstr_t 与 CComBSTRCComBSTR 、_bstr_t 是对 BSTR 的封
23、装 ,BSTR 是指向字符串的 32位指针。 char * 转换到 BSTR 可以这样 :BSTR b=_com_util:ConvertStringToBSTR(" 数据 ");/ 使用前需要加上头文件 comutil.h 反之可以使用 char *p=_com_util:ConvertBSTRToString(b);24(引 )VARIANT 、_variant_t 与 COleVariantVARIANT 的结构可以参考头文件 VC98IncludeOAIDL.H 中关于结构体 tagVARIANT 的定义。对于 VARIANT 变量的赋值:首先给 vt 成员赋值,指
24、明数据类型,再对联合结构中 相同数据类型的变量赋值,举个例子:VARIANT va; int a=2001; va.vt=VT_I4;/ 指明整型数据 va.lVal=a; / 赋值 对于不马上赋值的 VARIANT ,最好先用 Void VariantInit(V ARIANTARG FAR* pvarg); 进行初始化 ,其本质是将 vt 设置为 VT_EMPTY ,下表我们列举 vt 与常用数据的对应关系 unsigned char bVal; VT_UI1 short iVal; VT_I2 long lVal; VT_I4 float fltVal; VT_R4 double dbl
25、Val; VT_R8VARIANT_BOOL boolVal; VT_BOOL SCODE scode; VT_ERROR CY cyVal; VT_CY DATE date; VT_DA TE BSTR bstrVal; VT_BSTR IUnknown FAR* punkVal; VT_UNKNOWN IDispatch FAR* pdispVal; VT_DISPATCH SAFEARRAY FAR* parray; VT_ARRAY|* unsigned char FAR* pbVal; VT_BYREF|VT_UI1 short FAR* piVal; VT_BYREF|VT_I2
26、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 IUnknown FAR*
27、 FAR* ppunkVal; VT_BYREF|VT_UNKNOWNIDispatch FAR* FAR* ppdispVal; VT_BYREF|VT_DISPATCHSAFEARRAY FAR* FAR* pparray; VT_ARRAY|*VARIANT FAR* pvarVal; VT_BYREF|VT_V ARIANT void FAR* byref; VT_BYREF_variant_t 是 VARIANT 的封装类,其赋值可以使用强制类型转换,其构造函数会自 动处理这些数据类型。例如:long l=222;ing i=100;_variant_t lVal(l);lVal =
28、 (long)i;COleVariant 的使用与 _variant_t 的方法基本一样,请参考如下例子:COleVariant v3 = " 字符串 ", v4 = (long)1999;CString str =(BSTR)v3.pbstrVal;long i = v4.lVal;附录CString,string,char* 的综合比较(一(二(三)概述string和CString均是字符串模板类,string为标准模板类(STL)定义的字符串类,已经纳入C+标准之中;CString (typedef CStringT<TCHAR, StrTraitMFC<
29、TCHAR>> CString )为 Visual C+ 中最常用的字符 串类,继承自CSimpleStringT 类,主要应用在 MFC和ATL编程中,主要数据类型有char(应用于ANSI), wchar_t(unicode) , TCHAR(ANS与 unicode 均可);char*为C编程中最常用的字符串指针,一般以0'为结束标志;构造string 是方便的,可以从几乎所有的字符串构造而来,包括CString 次之,可以从基本的一些字符串变量构造而来,包括char* 没有构造函数,仅可以赋值;举例:I士 “”char* psz = “joise ”;CString
30、 和 char* ; char* 等;CString cstr( psz ); string str( cstr );a)operator=string 是最方便的,几乎可以直接用所有的字符串赋值,包括 CString 次之,可以直接用些基本的字符串赋值,包括 char* 只能由指针赋值,并且是极危险的操作,建议使用明的时候如未赋初值建议先设为NULL,以避免野指针,CString 和 char* ; 等;char*strcpy 或者 memcpy 而且 char* 在声令你抓狂;运算符重载举例:char *psz = NULL;psz = new char10; /当然,以上的直接写成 ch
31、ar *psz = new char10;也是一样memset( psz, 0, 10 );strcpy( psz, “joise ” );CString cstr;cstr = psz;string str;str = psz;str = cstr;delete psz;b) operator+string 与 CString 差不多,可以直接与 char* 进行加法, 但不可以相互使用 +运算符,即 string str = str + cstr是非法的,须转换成 char* ;char* 没有 +运算,只能使用 strcat 把两个指针连在一起; 举例:I士 “”char* psz =
32、“joise ”;CString cstr = psz;cstr = cstr + psz;string str = psz;str = str + str + psz;strcat( psz, psz );strcat( psz, cstr );/合法strcat( psz, str );/非法,由此可见, CString 可自动转换为 const char* ,而 string 不行c) operator +=string 是最强大的,几乎可以与所有的字符串变量+=,包括 CString 和 char* ;CString 次之,可以与基本的一些字符串变量进行 +=而来,包括 char* 等
33、;char* 没有 +=运算符,只能使用 strcat 把两个指针连在一起;d) operatorCString 最好,当越界时会抛出断言异常;string 与 char* 下标越界结果未定义;举例:I士 “”char* psz = “joise ”;CString cstr = psz;cout << cstr8;string str = psz;cout << str8;cout << psz8;e) operator= 、 operator!= 、 operator> 、 operator< 、 operator>= 、perator
34、<=CString 与 string 之间不可以进行比较,但均可以与 char* 进行比较,并且比较的是值,而不 是地址; cout << ( psz = cstr );cout << ( psz = str );cout << ( str = psz );cout << ( cstr = psz );/以上代码返回均为 1(四)常用算法a) 查找作用char*stringCString查找指定值strchr strstr strrstr strspnfindFind第一个匹配的值fild_first_ofFindOneOf从后面开始查找R
35、eserveFind指定匹配方式find_if注:find_if中是把范围内的值挨个代入匹配函数直至返回trueb) 比较作用char*stringCString查找指定值(区分大小写)strcmp strncmp strcoll _strncolloperatorv operator operator<= operator>= operator= operatorsCollateCompare查找指定值(不区分大小写)_stricmp _strnicmp _stricoll _strnicollCollateNoCaseCompareNoCase注:返回值如果0则前面的值小于后面的值,反之
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年智能交通系统专业资格考试试卷及答案
- 2025年职业生涯规划与发展考试试题及答案
- 2025年特殊教育服务与支持考试试题及答案
- 2025年广告与市场传播专业考生模拟考试试题及答案
- 2025年互联网金融专业试卷及答案
- 2025年公共关系与危机管理考试题及答案
- 2025年法律硕士考试试题及答案
- 2025年护士资格认证考试试题及答案
- 养殖合同协议书找谁弄
- 2025年多协议通信适配器合作协议书
- 科技公司员工道德与伦理培训计划
- 麻醉药品及第一类精神药品管理制度
- 港股通知识测试题及答案
- 2023WGDF糖尿病相关足病预防和管理指南
- 政治-山东省青岛市2025年高三年级第一次适应性检测(青岛一模)试题和答案
- 广州大学《PKPM结构软件应用》2023-2024学年第一学期期末试卷
- 部编版一年级语文下册 看拼音写词语专项训练 (图片版 含答案)
- 浙江省宁波2025年中考模拟考试数学试卷五套附参考答案
- 全国粤教清华版初中信息技术八年级下册第1单元第1节《从互联网到物联网》说课稿
- 《溺水急救方法》课件
- 教学艺术之探索
评论
0/150
提交评论