常见数据结构转换

来源:互联网 发布:java中session的用法 编辑:程序博客网 时间:2024/05/16 07:53

常用数据类型使用转换详解 
  先定义一些常见类型变量借以说明

  int i = 100;

  long l = 2001;

  float f=300.2;

  double d=12345.119;

  char username[]="女侠程佩君";

  char temp[200];

  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)"程序员";

  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可以这样: BSTR b=_com_util::ConvertStringToBSTR("数据");     //使用前需要加上头文件comutil.h

  反之可以使用char *p=_com_util::ConvertBSTRToString(b);

  六、VARIANT 、_variant_t 与 COleVariant

  VARIANT的结构可以参考头文件VC98/Include/OAIDL.H中关于结构体tagVARIANT的定义。

  对于VARIANT变量的赋值:首先给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_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 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

  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* 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的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。

  例如:

  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位数据(DWORD)分解成两个16位数据(WORD),例如:

  LPARAM lParam;

  WORD loValue = LOWORD(lParam);     //取低16位

  WORD hiValue = HIWORD(lParam);     //取高16位

  对于16位的数据(WORD)我们可以用同样的方法分解成高低两个8位数据(BYTE),例如:

  WORD 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.ReleaseBuffer();

  当我们需要字符数组时调用GetBuffer(int n),其中n为我们需要的字符数组的长度.使用完成后一定要马上调用ReleaseBuffer();

  还有很重要的一点就是,在能使用const char *的地方,就不要使用char *

  2、memcpy:

  CString mCS=_T("cxl");

  char mch[20];

  memcpy(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 TCHAR[Msg.GetLength()+1];

  _tcscpy(lpsz, Msg);

  char * psz;

  strcpy(psz,lpsz);

  CString类向const char *转换

  char a[100];

  CString str("aaaaaa");

  strncpy(a,(LPCTSTR)str,sizeof(a));

  或者如下:

  strncpy(a,str,sizeof(a));

  以上两种用法都是正确地. 因为strncpy的第二个参数类型为const char *.所以编译器会自动将CString类转换成const char *.

  CString转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";

  也可以利用构造函数,如:

  CString s1("Tom");

 

  将CString类型的变量赋给char []类型(字符串)的变量

  1、sprintf()函数

  CString str = "good";

  char tmp[200] ;

  sprintf(tmp, "%s",(LPCSTR)str);

  (LPCSTR)str这种强制转换相当于(LPTSTR)(LPCTSTR)str

  CString类的变量需要转换为(char*)的时,使用(LPTSTR)(LPCTSTR)str

  然而,LPCTSTR是const char *,也就是说,得到的字符串是不可写的!将其强制转换成LPTSTR去掉const,是极为危险的!

  一不留神就会完蛋!要得到char *,应该用GetBuffer()或GetBufferSetLength(),用完后再调用ReleaseBuffer()。

  2、strcpy()函数

  CString str;

  char c[256];

  strcpy(c, str);

  char mychar[1024];

  CString source="Hello";

  strcpy((char*)&mychar,(LPCTSTR)source);

  关于CString的使用

  1、指定 CString 形参

  对于大多数需要字符串参数的函数,最好将函数原型中的形参指定为一个指向字符 (LPCTSTR) 而非 CString 的 const 指针。

  当将形参指定为指向字符的 const 指针时,可将指针传递到 TCHAR 数组(如字符串 ["hi there"])或传递到 CString 对象。

  CString 对象将自动转换成 LPCTSTR。任何能够使用 LPCTSTR 的地方也能够使用 CString 对象。

  2、如果某个形参将不会被修改,则也将该参数指定为常数字符串引用(即 const CString&)。如果函数要修改该字符串,

  则删除 const 修饰符。如果需要默认为空值,则将其初始化为空字符串 [""],如下所示:

  void AddCustomer( const CString& name, const CString& address, const CString& comment = "" );

  3、对于大多数函数结果,按值返回 CString 对象即可。

  串的基本运算

  对于串的基本运算,很多高级语言均提供了相应的运算符或标准的库函数来实现。

  为叙述方便,先定义几个相关的变量:

  char s1[20]="dir/bin/appl",s2[20]="file.asm",s3[30],*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/appl",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的大小,

  //当s1s2和s1=s2时,分别返回小于0、大于0和等于0的值

  【例】result=strcmp("baker","Baker");    //result>0

  result=strcmp("12","12");       //result=0

  result=strcmp("Joe","joseph")   //result<0

  5、字符定位

  char *strchr(char *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是字符数组,用sub返回串s的第pos个字符起长度为len的子串

  //其中0<=pos<=strlen(s)-1,且数组sub至少可容纳len+1个字符。

  if (pos<0||pos>strlen(s)-1||len<0)

  Error("parameter error!");

  strncpy(sub,&s[pos],len);      //从s[pos]起复制至多len个字符到sub

原创粉丝点击