CStrin g是MFC提供的类,
ch ar* 是指向ANS I字符数组的指针,其中每个字符占据8位(有效数据是除掉最高位的其他7位),这里保持了与传统的C,C++的兼容。
LP的含义是长指针(lon g poi nter)。LPST R是一个指向以…\0‟结尾的A NSI字符数组的指针,与cha r*可以互换使用,在win32中较多地使用LPST R。
而L PCSTR中增加的…C‟的含义是“CON STANT”(常量),表明这种数据类型的实例不能被使用它的A PI函数改变,除此之外,它与L PSTR是等同的。
1.LP表示长指针,在win16下有长指针(LP)和短指针(P)的区别,而在wi n32下是没有区别的,都是32位.所以这里的LP和P是等价的.
2.C表示con st
3.T是什么东西呢,我们知道TCH AR在采用Unico de方式编译时是wc har_t,在普通时编译成ch ar.
字符串长度头文件
为了满足程序代码国际化的需要,业界推出了Unico de标准,它提供了一种简单和一致的表达字符串的方法,所有字符中的字节都是16位的值,其数量也可以满足差不多世界上所有书面语言字符的编码需求,开发程序时使用Uni code(类型为
wc har_t)是一种被鼓励的做法。
LP WSTR与LPCWS TR由此产生,它们的含义类似于LPSTR与LPCS TR,只是字符数据是16位的w char_t而不是c har。
然后为了实现两种编码的通用,提出了TC HAR的定义:
如果定义_UN ICODE,声明如下:
typ edefwchar_t TC HAR;
如果没有定义_UNI CODE,则声明如下:
typ edefcharTCHAR;
LP TSTR和LPCTS TR中的含义就是每个字符是这样的TCHA R。
C Strin g类中的字符就是被声明为TCH AR类型的,它提供了一个封装好的类供用户方便地使用。
LP CTSTR:
#if def _UNICO DE
type def c onstwchar_t *LPCTS TR;
#else
ty pedef cons t cha r * L PCTST R;
#e ndif
VC常用数据类型使用转换详解
先定义一些常见类型变量借以说明
in t i = 100;
long l =2001;
floa t f=300.2;
doub le d=12345.119;
char user name[]="张三丰";
c har t emp[200];
char*buf;
CStr ing s tr;
_varia nt_tv1;
_bstr_t v2;
一、其它数据类型转换为字符串
短整型(int)
i toa(i,temp,10);//将i转换为字符串放入tem p中,最后一个数字表示十进制 ito a(i,t emp,2); //按二进制方式转换
长整型(l ong)
lto a(l,t emp,10);
二、从其它包含字符串的变量中获取指向该字符串的指针
CS tring变量
st r = "2008北京奥运";
buf= (LP STR)(LPCTS TR)st r;
B STR类型的_var iant_t变量
v1 = (_bstr_t)"程序员";
buf = _com_util::Con vertB STRTo Strin g((_b str_t)v1);
三、字符串转换为其它数据类型
str cpy(t emp,"123");
短整型(int)
i= ato i(tem p);
长整型(l ong)
l =atol(temp);
浮点(doub le)
d = a tof(t emp);
四、其它数据类型转换到CS tring
使用C Strin g的成员函数Form at来转换,例如:
整数(i nt)
str.F ormat("%d",i);
浮点数(float)
st r.For mat("%f",i);
字符串指针(char*)等已经被CStr ing构造函数支持的数据类型可以直接赋值
str = us ernam e;
五、BSTR、_bst r_t与C ComBS TR
C ComBS TR、_b str_t是对BST R的封装,BSTR是指向字符串的32位指针。
ch ar *转换到BST R可以这样: BST R b=_com_u til::Conve rtStr ingTo BSTR("数据"); //使用前需要加上头文件co mutil.h
反之可以使用c har *p=_co m_uti l::Co nvert BSTRT oStri ng(b);
六、VARI ANT 、_vari ant_t与 CO leVar iant
VARI ANT的结构可以参考头文件VC98\In clude\OAID L.H中关于结构
体t agVAR IANT的定义。
对于VARI ANT变量的赋值:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子:
VARI ANT v a;
in t a=2001;
va.vt=VT_I4; //指明整型数据
va.lV al=a; //赋值
对于不马上赋值的VARIA NT,最好先用Voi d Var iantI nit(V ARIAN TARGFAR*pvarg);进行初始化,其本质是将vt设置为VT_EMPT Y,下表我们列举vt与常用数据的对应关系:
un signe d cha r bVa l; VT_UI1
shor t iVa l; VT_I2
longlVal; VT_I4
fl oat f ltVal; VT_R4
d ouble dblV al; V T_R8
VARI ANT_B OOL b oolVa l; VT_BOOL
SCO DE sc ode;VT_ER ROR
CY cy Val;VT_CY
DAT E dat e; VT_DATE
BST R bst rVal; VT_B STR
IUnkn own F AR* p unkVa l; VT_UNKN OWN
IDisp atchFAR*pdisp Val;VT_DI SPATC H
SA FEARR AY FA R* pa rray; VT_A RRAY|*
un signe d cha r FAR* pbV al; V T_BYR EF|VT_UI1
shor t FAR* piV al; V T_BYR EF|VT_I2
longFAR*plVal; VT_BYREF|VT_I4
fl oat F AR* p fltVa l; VT_BYRE F|VT_R4
d ouble FAR* pdbl Val;VT_BY REF|V T_R8
VARI ANT_B OOL F AR* p boolV al; V T_BYR EF|VT_BOOL
SCO DE FA R* ps code; VT_B YREF|VT_ER ROR
CY FA R* pc yVal; VT_B YREF|VT_CY
DAT E FAR* pda te; V T_BYR EF|VT_DATE
BST R FAR* pbs trVal; VT_BYREF|VT_B STR
IUnkn own F AR* F AR* p punkV al; V T_BYR EF|VT_UNKN OWN
IDisp atchFAR*FAR*ppdis pVal; VT_B YREF|VT_DI SPATC H
SA FEARR AY FA R* FA R* pp array; VT_ARRAY|*
V ARIAN T FAR* pva rVal; VT_B YREF|VT_VA RIANT
voi d FAR* byr ef; V T_BYR EF
_varia nt_t是VARIA NT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。
例如:
lo ng l=222;
ing i=100;
_var iant_t lVa l(l);
lVal = (l ong)i;
CO leVar iant的使用与_v arian t_t的方法基本一样,请参考如下例子:
COleV arian t v3= "字符串", v4 = (long)1999;
CStr ing s tr =(BSTR)v3.pb strVa l;
lo ng i= v4.lVal;
七、其它
对消息的处理中我们经常需要将WPA RAM或L PARAM等32位数据(DWO RD)分解成两个16位数据(W ORD),例如:
L PARAM lPar am;
W ORD l oValu e = L OWORD(lPar am);//取低16位
WOR D hiV alue= HIW ORD(l Param); //取高16位
对于16位的数据(WORD)我们可以用同样的方法分解成高低两个8位数据(BYT E),例如:
WOR D wVa lue;
BYTEloVal ue =LOBYT E(wVa lue);//取低8位
BYT E hiV alue= HIB YTE(w Value); //取高8位
如何将CS tring类型的变量赋给cha r*类型的变量
1、GetBu ffer函数:
使用CStri ng::G etBuf fer函数。
cha r *p;
CSt ringstr="hello";
p=str.GetBu ffer(str.G etLen gth());
s tr.Re lease Buffe r();
将CSt ring转换成cha r * 时
CStr ing s tr("a aaaaa a");
strcp y(str.GetB uffer(10),"aa");
str.Rele aseBu ffer();
当我们需要字符数组时调用GetBu ffer(int n),其中n为我们需要的字符数组的长度.使用完成后一定要马上调用Rele aseBu ffer();
还有很重要的一点就是,在能使用co nst c har *的地方,就不要使用c har *
2、m emcpy:
CS tring mCS=_T("c xl");
cha r mch[20];
mem cpy(m ch,mC S,20);
3、用LPCT STR强制转换:尽量不使用
char*ch;
CStr ing s tr;
ch=(L PSTR)(LPCT STR)s tr;
CStri ng st r = "good";
cha r *tm p;
sp rintf(tmp,"%s",(LPTS TR)(L PCTST R)str);
4、
CSt ringMsg;
Msg=Msg+"abc";
LPT STR l psz;
lpsz = ne w TCH AR[Ms g.Get Lengt h()+1];
_tcscp y(lps z, Ms g);
char* psz;
st rcpy(psz,l psz);
CS tring类向con st ch ar *转换
cha r a[100];
CStri ng st r("aa aaaa");
st rncpy(a,(L PCTST R)str,size of(a));
或者如下:
s trncp y(a,s tr,si zeof(a));
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论