ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:22.57KB ,
资源ID:11854951      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11854951.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(vc++各种字符串.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

vc++各种字符串.docx

1、vc+各种字符串vc+中各种字符串。发表于2008-12-31程序开发没有评论 查看 18 次 CString ,BSTR ,LPCTSTR之间关系和区别CString是一个动态TCHAR数组,BSTR是一种专有格式的字符串(需要用系统提供的函数来操纵,LPCTSTR只是一个常量的TCHAR指针。CString 是一个完全独立的类,动态的TCHAR数组,封装了 + 等操作符和字符串操作方法。typedef OLECHAR FAR* BSTR;typedef const char * LPCTSTR;vc+中各种字符串的表示法首先char* 是指向ANSI字符数组的指针,其中每个字符占据8位(有

2、效数据是除掉最高位的其他7位),这里保持了与传统的C,C+的兼容。LP的含义是长指针(long pointer)。LPSTR是一个指向以/0结尾的ANSI字符数组的指针,与char*可以互换使用,在win32中较多地使用LPSTR。而LPCSTR中增加的C的含义是“CONSTANT”(常量),表明这种数据类型的实例不能被使用它的API函数改变,除此之外,它与LPSTR是等同的。1.LP表示长指针,在win16下有长指针(LP)和短指针(P)的区别,而在win32下是没有区别的,都是32位.所以这里的LP和P是等价的.2.C表示const3.T是什么东西呢,我们知道TCHAR在采用Unicode

3、方式编译时是wchar_t,在普通时编译成char.为了满足程序代码国际化的需要,业界推出了Unicode标准,它提供了一种简单和一致的表达字符串的方法,所有字符中的字节都是16位的值,其数量也可以满足差不多世界上所有书面语言字符的编码需求,开发程序时使用Unicode(类型为wchar_t)是一种被鼓励的做法。LPWSTR与LPCWSTR由此产生,它们的含义类似于LPSTR与LPCSTR,只是字符数据是16位的wchar_t而不是char。然后为了实现两种编码的通用,提出了TCHAR的定义:如果定义_UNICODE,声明如下:typedef wchar_t TCHAR;如果没有定义_UNIC

4、ODE,则声明如下:typedef char TCHAR;LPTSTR和LPCTSTR中的含义就是每个字符是这样的TCHAR。CString类中的字符就是被声明为TCHAR类型的,它提供了一个封装好的类供用户方便地使用。LPCTSTR:#ifdef _UNICODEtypedef const wchar_t * LPCTSTR;#elsetypedef const char * LPCTSTR;#endifVC常用数据类型使用转换详解先定义一些常见类型变量借以说明int i = 100;long l = 2001;float f=300.2;double d=12345.119;char us

5、ername=女侠程佩君;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);二、从其它包含字符串的变量中获取指向该字符串的指针CString变量str = 2008北京奥运;buf = (LPSTR)(LPCTSTR)str;BSTR类型的_variant_t变量v1 = (_bstr_t)程序员

6、;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 = usernam

7、e;五、BSTR、_bstr_t与CComBSTRCComBSTR、_bstr_t是对BSTR的封装,BSTR是指向字符串的32位指针。char *转换到BSTR可以这样: BSTR b=_com_util:ConvertStringToBSTR(数据);/使用前需要加上头文件comutil.h反之可以使用char *p=_com_util:ConvertBSTRToString(b);六、VARIANT 、_variant_t 与 COleVariantVARIANT的结构可以参考头文件VC98/Include/OAIDL.H中关于结构体tagVARIANT的定义。对于VARIANT变量的赋

8、值:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子:VARIANT va;int a=2001;va.vt=VT_I4; /指明整型数据va.lVal=a; /赋值对于不马上赋值的VARIANT,最好先用Void VariantInit(VARIANTARG FAR* pvarg);进行初始化,其本质是将vt设置为VT_EMPTY,下表我们列举vt与常用数据的对应关系:unsigned char bVal; VT_UI1short iVal; VT_I2long lVal; VT_I4float fltVal; VT_R4double dblVal; VT_R

9、8VARIANT_BOOL boolVal; VT_BOOLSCODE scode; VT_ERRORCY cyVal; VT_CYDATE date; VT_DATEBSTR bstrVal; VT_BSTRIUnknown FAR* punkVal; VT_UNKNOWNIDispatch FAR* pdispVal; VT_DISPATCHSAFEARRAY FAR* parray; VT_ARRAY|*unsigned char FAR* pbVal; VT_BYREF|VT_UI1short FAR* piVal; VT_BYREF|VT_I2long FAR* plVal; VT_

10、BYREF|VT_I4float FAR* pfltVal; VT_BYREF|VT_R4double FAR* pdblVal; VT_BYREF|VT_R8VARIANT_BOOL FAR* pboolVal; VT_BYREF|VT_BOOLSCODE FAR* pscode; VT_BYREF|VT_ERRORCY FAR* pcyVal; VT_BYREF|VT_CYDATE FAR* pdate; VT_BYREF|VT_DATEBSTR FAR* pbstrVal; VT_BYREF|VT_BSTRIUnknown FAR* FAR* ppunkVal; VT_BYREF|VT_

11、UNKNOWNIDispatch FAR* FAR* ppdispVal; VT_BYREF|VT_DISPATCHSAFEARRAY FAR* FAR* pparray; VT_ARRAY|*VARIANT FAR* pvarVal; VT_BYREF|VT_VARIANTvoid FAR* byref; VT_BYREF_variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。例如:long l=222;ing i=100;_variant_t lVal(l);lVal = (long)i;COleVariant的使用与_variant_t

12、的方法基本一样,请参考如下例子:COleVariant v3 = 字符串, v4 = (long)1999;CString str =(BSTR)v3.pbstrVal;long i = v4.lVal;七、其它对消息的处理中我们经常需要将WPARAM或LPARAM等32位数据(DWORD)分解成两个16位数据(WORD),例如:LPARAM lParam;WORD loValue = LOWORD(lParam);/取低16位WORD hiValue = HIWORD(lParam);/取高16位对于16位的数据(WORD)我们可以用同样的方法分解成高低两个8位数据(BYTE),例如:WOR

13、D wValue;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);str.Release

14、Buffer();当我们需要字符数组时调用GetBuffer(int n),其中n为我们需要的字符数组的长度.使用完成后一定要马上调用ReleaseBuffer();还有很重要的一点就是,在能使用const char *的地方,就不要使用char *2、memcpy:CString mCS=_T(cxl);char mch20;memcpy(mch,mCS,20);3、用LPCTSTR强制转换: 尽量不使用char *ch;CString str;ch=(LPSTR)(LPCTSTR)str;CString str = good;char *tmp;sprintf(tmp,s,(LPTSTR)

15、(LPCTSTR)str);4、CString Msg;Msg=Msg+abc;LPTSTR lpsz;lpsz = new TCHARMsg.GetLength()+1;_tcscpy(lpsz, Msg);char * psz;strcpy(psz,lpsz);CString类向const char *转换char a100;CString str(aaaaaa);strncpy(a,(LPCTSTR)str,sizeof(a);或者如下:strncpy(a,str,sizeof(a);以上两种用法都是正确地. 因为strncpy的第二个参数类型为const char *.所以编译器会自动

16、将CString类转换成const char *.CString转LPCTSTR (const char *)CString cStr;const char *lpctStr=(LPCTSTR)cStr;LPCTSTR转CStringLPCTSTR lpctStr;CString cStr=lpctStr;将char*类型的变量赋给CString型的变量可以直接赋值,如:CString myString = This is a test;也可以利用构造函数,如:CString s1(Tom);将CString类型的变量赋给char 类型(字符串)的变量1、sprintf()函数CString

17、str = good;char tmp200 ;sprintf(tmp, s,(LPCSTR)str);(LPCSTR)str这种强制转换相当于(LPTSTR)(LPCTSTR)strCString类的变量需要转换为(char*)的时,使用(LPTSTR)(LPCTSTR)str然而,LPCTSTR是const char *,也就是说,得到的字符串是不可写的!将其强制转换成LPTSTR去掉const,是极为危险的!一不留神就会完蛋!要得到char *,应该用GetBuffer()或GetBufferSetLength(),用完后再调用ReleaseBuffer()。2、strcpy()函数CS

18、tring str;char c256;strcpy(c, str);char mychar1024;CString source=Hello;strcpy(char*)&mychar,(LPCTSTR)source);关于CString的使用1、指定 CString 形参对于大多数需要字符串参数的函数,最好将函数原型中的形参指定为一个指向字符 (LPCTSTR) 而非 CString 的 const 指针。当将形参指定为指向字符的 const 指针时,可将指针传递到 TCHAR 数组(如字符串 hi there)或传递到 CString 对象。CString 对象将自动转换成 LPCTSTR

19、。任何能够使用 LPCTSTR 的地方也能够使用 CString 对象。2、如果某个形参将不会被修改,则也将该参数指定为常数字符串引用(即 const CString&)。如果函数要修改该字符串,则删除 const 修饰符。如果需要默认为空值,则将其初始化为空字符串 ,如下所示:void AddCustomer( const CString& name, const CString& address, const CString& comment = );3、对于大多数函数结果,按值返回 CString 对象即可。串的基本运算对于串的基本运算,很多高级语言均提供了相应的运算符或标准的库函数来实

20、现。为叙述方便,先定义几个相关的变量:char s120=dir/bin/appl,s220=file.asm,s330,*p;int result;下面以C语言中串运算介绍串的基本运算1、求串长int strlen(char *s);/求串s的长度【例】printf(d,strlen(s1); /输出s1的串长122、串复制char *strcpy(char *to,*from);/将from串复制到to串中,并返回to开始处指针【例】strcpy(s3,s1); /s3=dir/bin/appl,s1串不变3、联接char *strcat(char *to,char *from);/将fr

21、om串复制到to串的末尾,/并返回to串开始处的指针【例】strcat(s3,/); /s3=dir/bin/appl/strcat(s3,s2);/s3=dir/bin/appl/file.asm4、串比较int strcmp(char *s1,char *s2);/比较s1和s2的大小,/当s1s2和s1=s2时,分别返回小于0、大于0和等于0的值【例】result=strcmp(baker,Baker); /result0result=strcmp(12,12);/result=0result=strcmp(Joe,joseph)/result05、字符定位char *strchr(ch

22、ar *s,char c);/找c在字符串s中第一次出现的位置,/若找到,则返回该位置,否则返回NULL【例】p=strchr(s2,.); /p指向file之后的位置if(p) strcpy(p,.cpp);/s2=file.cpp注意:上述操作是最基本的,其中后 4个操作还有变种形式:strncpy,strncath和strnchr。其它的串操作见C的。在不同的高级语言中,对串运算的种类及符号都不尽相同其余的串操作一般可由这些基本操作组合而成【例】求子串的操作可如下实现:void substr(char *sub,char *s,int pos,int len)/s和sub是字符数组,用s

23、ub返回串s的第pos个字符起长度为len的子串/其中0=pos=strlen(s)-1,且数组sub至少可容纳len+1个字符。if (posstrlen(s)-1|len0)Error(parameter error!);strncpy(sub,&spos,len); /从spos起复制至多len个字符到sub字符串、字符数组、数组、指针关系总结。发表于2008-10-25程序开发没有评论 查看 37 次 【规则】1、string为普通类型,不是数组型,只是其内容为字符串;2、a和”a”的区别:a为字符,”a”为字符串;单引号只能定义一个字符,双引号可以定义多个字符,即字符串。3、指针可以

24、通过加减、自加减改变其值,数组不可以。4、以数组定义的字符串可以修改其中的字符,以指针定义的字符串不能修改其中的字符。例如:char a=”hello”;couta; /输出 hellocout*(a+1); /输出 e,即数组a的第2个字符,即a1couta1; /输出 e,即数组a的第2个字符,与上同cout*a+; /错误,规则3,数组名是常量,不可以改变其值cout*a; /输出 h,即数组a的第一个字符couta; /输出hello*a=”L”; /错误,规则2,*a为字符,”L”为字符串,不匹配*a=L;/正确,规则4,将数组第一个字符修改为Lcouta; /输出 Lelloa2=

25、6;/正确,规则4,将数组第3个字符修改为6couta; /输出 Le6lochar *a=hello;couta; /输出 hellocout*(a+1); /输出 e,即字符串a的第2个字符couta1;/输出 e,即字符串a的第2个字符,这里也可以视为数组acout*a+; /输出 h,规则3,即先计算*a,再使a=a+1cout*a;/输出 e,因上一行中a已经自加1couta; /输出 ello,因为指针a已经发生变化,指向了下一个地址,即指向以e开头的字符串*a=L;/错误,规则4,不能修改指针定义的字符串的字符。 /【注意】此处编译可通过,运行时会出错,提示“不能写入”a2=6;

26、/错误,规则4,不能修改指针定义的字符串的字符。string型(需要string头文件)char型(不需要string头文件)char a=m;正确char a=”m”;错误char *a=”m”;正确char a=”m”;正确string a=”hello”;正确char a=”hello”;错误string *a=”hello”;错误char *a=”hello”;正确string a=”hello”;错误char a=”hello”;正确string *p=a;错误char *p=a;正确string *p=&a;正确char *p=&a;错误couta;a的值couta;a的值cout

27、*a;错误cout*a;a的首字符cout&a;a的地址cout&a;a的地址1、 字符数组相当于字符串 2、其末尾字符为 0 3、其长度有效字符数+1,在定义字符数组长度时切记。 4、初始化方法 char arr6 = hello; char arr6 = hello; /与第种相同,一般使用这一个 char arr6 = h,e,l,l,o,0; /主要在特殊字符时使用 5、a 和 a 的区别:前者是字符串,占用2个字节空间,后者是字符,占用1个字节空间。 6、数组长度计算: (1)sizeof 方法:sizeof(数组名)/ sizeof(数组类型名) 说明:数组占用字节除以数组类型所占

28、字节,结果为数组元素个数 (2)strlen 说明:strlen,求字符串有效长度 方法:strlen(字符数组名) /结果为字符数组有效字符长度,不包括末尾的 0 对于char arr=hello;来说,sizeof(arr)为6,包含了数组末尾的0,而strlen(arr)为5,不包含末尾的0; 而对于其它类型的数组来说,没有strlen命令,sizeof(数组名)计算的结果就是这个数组所占用的字节数。 7、字符数组输出的特殊性C+规定,数组的名称就是数组的首地址,对于a 来说,a就是数组a的地址,但是在输出字符数组时,却有特殊的地方:#include using namespace std; void main() char a=How a you!; couta=aendl; char c=H,o,w, ,a, ,y,o,u,!,0; coutc=cendl; int b=1,2,3,4,5,6,7,8,9; coutb=bendl; 对常规数组来说,输出要使用循环。但是在上例中,输出字符数组(字符串)时,使用cout可以直接输出。运行结果:a=How a you!c=How a

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1