• VC++中数据类型转换总结[转]


    int   i   =   100;  
      long   l   =   2001;  
      float   f=300.2;  
      double   d=12345.119;  
      char   username[]="Lonefox";  
      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的结构可以参考头文件VC\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位

     

    ======================

    下文转自:http://blog.csdn.net/allenky/archive/2007/06/12/1649065.aspx

    CString、char*、string、int、_bstr_t、CTime、COleDateTime等等的相互转换,如何判断一个字符串是一个浮点数?

    #include<string>
    using namespace std;
    #include <COMDEF.H>
    {
    CString strCString="ABC";
    char strchar[256],*pstr;

    pstr=(LPSTR)(LPCTSTR)strCString; //CString---->char*
    strcpy(strchar,(LPSTR)(LPCTSTR)strCString); //CString---->char[]

    _bstr_t strbstr=pstr; //char*---->_bstr_t
    WCHAR *strWCHAR=strbstr; //b_str_t--->UNICODE

    strbstr=strWCHAR;
    pstr=strbstr; //UNICODE---->char*

    strCString="10";
    int istr=atoi((LPSTR)(LPCTSTR)strCString); //CString、char[]、char*------>int
    strCString.Format("%d",istr); //int----->CString
    sprintf(strchar,"%d",istr); //int----->char[]

    pstr=new char[256]; //字符串申请空间
    strcpy(pstr,"ABC"); //字符串赋值
    delete []pstr; //字符串释放

    string strstring="ABC";
    pstr=(char*)strstring.c_str(); //string---->char*

    strCString="2003-10-27 6:24:37"; //CString--->COleDateTime
    COleVariant vtime(strCString);
    vtime.ChangeType(VT_DATE);
    COleDateTime time4=vtime;

    COleDateTime time1(1977,4,16,2,2,2); //COleDataTime--->CTime
    SYSTEMTIME systime;
    VariantTimeToSystemTime(time1, &systime);
    CTime tm(systime);

    time_t time2=tm.GetTime(); //CTime--->time_t
    COleDateTime time3(time2); //time_t--->COleDateTime

    //判断字符串是否是某种类型
    CString sValue("123.1");
    COleVariant vValue(sValue);

    BOOL bStrIsFloat = (SUCCEEDED(VariantChangeType(&vValue, &vValue, 0, VT_R8)) && sValue.Find('.') != -1);
    if(bStrIsFloat)
    {
    AfxMessageBox("浮点");
    }


    CString==>UNICODE
          wchar_t  s[20];
          CString str=“你好”;
          wcscpy(s,(LPCTSTR)str); //前面没有转成UNICODE编码,所以这里需要强制转换

    CString与其他类型转换

    1、char*转换成CString

    若将char*转换成CString,除了直接赋值外,还可使用CString::Format进行。例如:
    char chArray[] = "This is a test";
    char * p = "This is a test";



    LPSTR p = "This is a test"; 

    或在已定义Unicode应的用程序中

    TCHAR * p = _T("This is a test"; 



    LPTSTR p = _T("This is a test";
    CString theString = chArray;
    theString.Format(_T("%s", chArray);
    theString = p; 

    2、CString转换成char*

    若将CString类转换成char*(LPSTR)类型,常常使用下列三种方法:

    方法一,使用强制转换。例如:

    CString theString( "This is a test" ;
    LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString; 

    方法二,使用strcpy。例如:

    CString theString( "This is a test" ;
    LPTSTR lpsz = new TCHAR[theString.GetLength()+1];
    _tcscpy(lpsz, theString); 

    需要说明的是,strcpy(或可移值Unicode/MBCS的_tcscpy)的第二个参数是 const wchar_t* (Unicode)或const char* (ANSI),系统编译器将会自动对其进行转换。

    方法三,使用CString::GetBuffer。例如:

    CString s(_T("This is a test ";
    LPTSTR p = s.GetBuffer();
    // 在这里添加使用p的代码
    if(p != NULL) *p = _T('\0');
    s.ReleaseBuffer(); 
    // 使用完后及时释放,以便能使用其它的CString成员函数 

    3、BSTR转换成char*

    方法一,使用ConvertBSTRToString。例如:

    #include 
    #pragma comment(lib, "comsupp.lib"
    int _tmain(int argc, _TCHAR* argv[])
    {
    BSTR bstrText = ::SysAllocString(L"Test";
    char* lpszText2 = _com_util::ConvertBSTRToString(bstrText);
    SysFreeString(bstrText); // 用完释放
    delete[] lpszText2;
    return 0;


    方法二,使用_bstr_t的赋值运算符重载。例如:

    _bstr_t b = bstrText;
    char* lpszText2 = b; 

    4、char*转换成BSTR

    方法一,使用SysAllocString等API函数。例如:

    BSTR bstrText = ::SysAllocString(L"Test";
    BSTR bstrText = ::SysAllocStringLen(L"Test",4);
    BSTR bstrText = ::SysAllocStringByteLen("Test",4); 

    方法二,使用COleVariant或_variant_t。例如:

    //COleVariant strVar("This is a test";
    _variant_t strVar("This is a test";
    BSTR bstrText = strVar.bstrVal; 

    方法三,使用_bstr_t,这是一种最简单的方法。例如:

    BSTR bstrText = _bstr_t("This is a test"; 

    方法四,使用CComBSTR。例如:

    BSTR bstrText = CComBSTR("This is a test"; 



    CComBSTR bstr("This is a test";
    BSTR bstrText = bstr.m_str; 

    方法五,使用ConvertStringToBSTR。例如:

    char* lpszText = "Test";
    BSTR bstrText = _com_util::ConvertStringToBSTR(lpszText); 

    5、CString转换成BSTR

    通常是通过使用CStringT::AllocSysString来实现。例如:

    CString str("This is a test";
    BSTR bstrText = str.AllocSysString();

    SysFreeString(bstrText); // 用完释放 

    6、BSTR转换成CString

    一般可按下列方法进行:

    BSTR bstrText = ::SysAllocString(L"Test";
    CStringA str;
    str.Empty();
    str = bstrText; 



    CStringA str(bstrText); 

    7、ANSI、Unicode和宽字符之间的转换

    方法一,使用MultiByteToWideChar将ANSI字符转换成Unicode字符,使用WideCharToMultiByte将Unicode字符转换成ANSI字符。

    方法二,使用“_T”将ANSI转换成“一般”类型字符串,使用“L”将ANSI转换成Unicode,而在托管C++环境中还可使用S将ANSI字符串转换成String*对象。例如:

    TCHAR tstr[] = _T("this is a test";
    wchar_t wszStr[] = L"This is a test";
    String* str = S”This is a test”; 

    方法三,使用ATL 7.0的转换宏和类。ATL7.0在原有3.0基础上完善和增加了许多字符串转换宏以及提供相应的类,它具有如图3所示的统一形式:

    其 中,第一个C表示“类”,以便于ATL 3.0宏相区别,第二个C表示常量,2表示“to”,EX表示要开辟一定大小的缓冲。SourceType和 DestinationType可以是A、T、W和OLE,其含义分别是ANSI、Unicode、“一般”类型和OLE字符串。例如,CA2CT就是将 ANSI转换成一般类型的字符串常量。下面是一些示例代码:

    LPTSTR tstr= CA2TEX<16>("this is a test";
    LPCTSTR tcstr= CA2CT("this is a test";
    wchar_t wszStr[] = L"This is a test";
    char* chstr = CW2A(wszStr); 



    1.Cstring转换为char *
       Cstring strFileName; 
       int length = strFileName.GetLength();
       char *cFileName; 
       cFileName=(char *)strFileName.GetBuffer(length);
    2. Cstring转化为 LPSTR
       Cstring str;
       LPSTR lpstr = (LPSTR)str;
    3. Cstring转化为 LPCSTR
       int length = strFileName.GetLength();
       size_t aLen = length + 1;

       LPCSTR lpstrFileName = (LPCSTR)strFileName.GetBuffer(length);
       int length = strFileName.GetLength();
       size_t aLen = length + 1;
    4. Cstring转化为 LPOLESTR
       int length = strFileName.GetLength();
       size_t aLen = length + 1;
       LPCSTR lpstrFileName = (LPCSTR)strFileName.GetBuffer(length);
       int wLen = MultiByteToWideChar(CP_ACP, 0,lpstrFileName,aLen, NULL,0);
       LPOLESTR lpFileName = new WCHAR [wLen];
       MultiByteToWideChar(CP_ACP, 0,lpstrFileName,aLen,lpFileName,wLen);

  • 相关阅读:
    浅谈JavaScript的面向对象程序设计(二)
    浅谈JavaScript的面向对象程序设计(一)
    浅谈JavaScript的字符串的replace方法
    JavaScript基本类型与引用类型(二)
    JavaScript函数(二)
    JavaScript正则表达式
    JavaScript对象和数组
    JavaScript垃圾收集
    JavaScript变量作用域
    转载:不定义JQuery插件,不要说会JQuery
  • 原文地址:https://www.cnblogs.com/chuncn/p/1374114.html
Copyright © 2020-2023  润新知