对有关数据类型转换的整理

 

 1 int  i  =   100 ;
 2 long  l  =   2001 ;
 3 float  f = 300.2 ;
 4 double  d = 12345.119 ;
 5 char  username[] = " 程佩君 " ;
 6 char  temp[ 200 ];
 7 char   * buf;
 8 CString str;
 9 _variant_t v1;
10 _bstr_t v2;
11

一、其它数据类型转换为字符串
 1 短整型( int
 2 itoa(i,temp, 10 ); /**/ ///将i转换为字符串放入temp中,最后一个数字表示十进制
 3 itoa(i,temp, 2 );  /**/ ///按二进制方式转换 
 4 长整型( long
 5 ltoa(l,temp, 10 ); 
 6 浮点数( float , double
 7 用fcvt可以完成转换,这是MSDN中的例子:
 8 int   decimal , sign; 
 9 char   * buffer; 
10 double  source  =   3.1415926535
11 buffer  =  _fcvt( source,  7 & decimal & sign ); 
12 运行结果:source:  3.1415926535  buffer:  ' 31415927 '   decimal 1  sign:  0
13 decimal表示小数点的位置,sign表示符号:0为正数,1为负数 
14 CString变量 
15 str  =   " 2008北京奥运 " ;
16 buf  =  (LPSTR)(LPCTSTR)str; 
17 BSTR变量 
18 BSTR bstrValue  =  ::SysAllocString(L " 程序员 " ); 
19 char   *  buf  =  _com_util::ConvertBSTRToString(bstrValue); 
20 SysFreeString(bstrValue); 
21 AfxMessageBox(buf); 
22 delete(buf); 
23 CComBSTR变量 
24 CComBSTR bstrVar( " test " ); 
25 char   * buf  =  _com_util::ConvertBSTRToString(bstrVar.m_str); 
26 AfxMessageBox(buf); 
27 delete(buf); 
28
29 _bstr_t变量 
30 _bstr_t类型是对BSTR的封装,因为已经重载了 = 操作符,所以很容易使用
31 _bstr_t bstrVar( " test " ); 
32 const   char   * buf  =  bstrVar; /**/ ///不要修改buf中的内容 
33 AfxMessageBox(buf); 
34
35
36 通用方法(针对非COM数据类型) 
37 用sprintf完成转换
38
39 char  buffer[ 200 ];  char  c  =   ' 1 ' int  i  =   35 long  j  =   1000 float  f  =   1.7320534f ; sprintf( buffer,  " %c " ,c); sprintf( buffer,  " %d " ,i); sprintf( buffer,  " %d " ,j); sprintf( buffer,  " %f " ,f); 
40

二、字符串转换为其它数据类型
 1 strcpy(temp, " 123 " ); 
 2
 3 短整型( int
 4 =  atoi(temp); 
 5 长整型( long
 6 =  atol(temp); 
 7 浮点( double
 8 =  atof(temp); 
 9 CString变量 
10 CString name  =  temp; 
11 BSTR变量 
12 BSTR bstrValue  =  ::SysAllocString(L " 程序员 " ); 
13 /**/ ///完成对bstrValue的使用
14 SysFreeString(bstrValue); 
15
16 CComBSTR变量 
17 CComBSTR类型变量可以直接赋值
18 CComBSTR bstrVar1( " test " );
19 CComBSTR bstrVar2(temp);
20
21 _bstr_t变量 
22 _bstr_t类型的变量可以直接赋值
23 _bstr_t bstrVar1( " test " ); 
24 _bstr_t bstrVar2(temp); 
25

三、其它数据类型转换到CString

 1 使用CString的成员函数Format来转换,例如:
 2
 3
 4 整数( int )
 5 str.Format( " %d " ,i); 
 6 浮点数( float )
 7 str.Format( " %f " ,i); 
 8 字符串指针( char   * )等已经被CString构造函数支持的数据类型可以直接赋值
 9 str  =  username; 
10 对于Format所不支持的数据类型,可以通过上面所说的关于其它数据类型转化到char  * 的方法先转到char  * ,然后赋值给CString变量。

四、BSTR、_bstr_t与CComBSTR
 1 CComBSTR 是ATL对BSTR的封装,_bstr_t是C ++ 对BSTR的封装,BSTR是32位指针,但并不直接指向字串的缓冲区。
 2 char   * 转换到BSTR可以这样: 
 3 BSTR b = _com_util::ConvertStringToBSTR( " 数据 " ); /**/ ///使用前需要加上comutil.h和comsupp.lib
 4 SysFreeString(bstrValue); 
 5 反之可以使用
 6 char   * p = _com_util::ConvertBSTRToString(b);
 7 delete p;
 8 具体可以参考一,二段落里的具体说明。
 9
10 CComBSTR与_bstr_t对大量的操作符进行了重载,可以直接进行 = , != , == 等操作,所以使用非常方便。
11 特别是_bstr_t,建议大家使用它。

五、VARIANT 、_variant_t 与 COleVariant

 1 VARIANT的结构可以参考头文件VC98\Include\OAIDL.H中关于结构体tagVARIANT的定义。
 2 对于VARIANT变量的赋值:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子:
 3 VARIANT va;
 4 int  a = 2001 ;
 5 va.vt = VT_I4; /**/ ///指明整型数据
 6 va.lVal = a;  /**/ ///赋值 
 7   
 8   
 9 _variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。
10 使用时需加上#include  < comdef.h >
11 例如:
12 long  l = 222 ;
13 ing i = 100 ;
14 _variant_t lVal(l);
15 lVal  =  ( long )i; 
16
17 COleVariant的使用与_variant_t的方法基本一样,请参考如下例子:
18 COleVariant v3  =   " 字符串 " , v4  =  ( long ) 1999 ;
19 CString str  = (BSTR)v3.pbstrVal;
20 long  i  =  v4.lVal;
21
22 /**/ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
23 本主题演示如何将各种 C ++  字符串类型转换为其他字符串。可以转换的字符串类型包括  char   * 、wchar_t * 、_bstr_t、CComBSTR、CString、basic_string 和 System.String。在所有情况下,在将字符串转换为新类型时,都会创建字符串的副本。对新字符串进行的任何更改都不会影响原始字符串,反之亦然。
24
25
     
        从 char * 转换
 1 // 此示例演示如何从 char * 转换为上面列出的其他字符串类型。
 2 //  convert_from_char.cpp
 3 //  compile with /clr /link comsuppw.lib
 4 #include  < iostream >
 5 include  < stdlib.h > #include  < string >
 6 #include  " atlbase.h " #include  " atlstr.h " #include  " comutil.h "
 7 using   namespace  std; using   namespace  System;
 8 int  main() {    char *orig = "Hello, World!";    cout << orig << " (char *)" << endl;
 9    // Convert to a wchar_t*    size_t origsize = strlen(orig) + 1;    const size_t newsize = 100;    size_t convertedChars = 0;    wchar_t wcstring[newsize];    mbstowcs_s(&convertedChars, wcstring, origsize, orig, _TRUNCATE);    wcscat_s(wcstring, L" (wchar_t *)");    wcout << wcstring << endl;
10    // Convert to a _bstr_t    _bstr_t bstrt(orig);    bstrt += " (_bstr_t)";    cout << bstrt << endl;
11    // Convert to a CComBSTR    CComBSTR ccombstr(orig);    if (ccombstr.Append(L" (CComBSTR)") == S_OK)    {        CW2A printstr(ccombstr);        cout << printstr << endl;    }
12    // Convert to a CString    CString cstring(orig);    cstring += " (CString)";    cout << cstring << endl;
13    // Convert to a basic_string    string basicstring(orig);    basicstring += " (basic_string)";    cout << basicstring << endl;
14    // Convert to a System::String    String ^systemstring = gcnew String(orig);    systemstring += " (System::String)";    Console::WriteLine("{0}", systemstring);    delete systemstring;}
1 // 输出
2 Hello, World !  ( char   * )
3 Hello, World !  (wchar_t  * )
4 Hello, World !  (_bstr_t)
5 Hello, World !  (CComBSTR)
6 Hello, World !  (CString)
7 Hello, World !  (basic_string)
8 Hello, World !  (System::String)

       从 wchar_t * 转换
 1 此示例演示如何从 wchar_t  *  转换为上面列出的其他字符串类型。
 2
 3 //  convert_from_wchar_t.cpp //  compile with /clr /link comsuppw.lib
 4 #include  < iostream > #include  < stdlib.h > #include  < string >
 5 #include  " atlbase.h " #include  " atlstr.h " #include  " comutil.h "
 6 using   namespace  std; using   namespace  System;
 7 int  main() {    wchar_t *orig = L"Hello, World!";    wcout << orig << L" (wchar_t *)" << endl;
 8    // Convert to a char*    size_t origsize = wcslen(orig) + 1;    const size_t newsize = 100;    size_t convertedChars = 0;    char nstring[newsize];    wcstombs_s(&convertedChars, nstring, origsize, orig, _TRUNCATE);    strcat_s(nstring, " (char *)");    cout << nstring << endl;
 9    // Convert to a _bstr_t    _bstr_t bstrt(orig);    bstrt += " (_bstr_t)";    cout << bstrt << endl;
10    // Convert to a CComBSTR    CComBSTR ccombstr(orig);    if (ccombstr.Append(L" (CComBSTR)") == S_OK)    {        CW2A printstr(ccombstr);        cout << printstr << endl;    }
11    // Convert to a CString    CString cstring(orig);    cstring += " (CString)";    cout << cstring << endl;
12    // Convert to a basic_string    wstring basicstring(orig);    basicstring += L" (basic_string)";    wcout << basicstring << endl;
13    // Convert to a System::String    String ^systemstring = gcnew String(orig);    systemstring += " (System::String)";    Console::WriteLine("{0}", systemstring);    delete systemstring;} 
14//输出
15Hello, World! (wchar_t *)Hello, World! (char *)Hello, World! (_bstr_t)Hello, World! (CComBSTR)Hello, World! (CString)Hello, World! (basic_string)Hello, World! (System::String)

  1 从 _bstr_t 转换
  2  
  3
  4 示例
  5
  6 说明
  7 此示例演示如何从 _bstr_t 转换为上面列出的其他字符串类型。
  8
  9 //  convert_from_bstr_t.cpp //  compile with /clr /link comsuppw.lib
 10 #include  < iostream > #include  < stdlib.h > #include  < string >
 11 #include  " atlbase.h " #include  " atlstr.h " #include  " comutil.h "
 12 using   namespace  std; using   namespace  System;
 13 int  main() {    _bstr_t orig("Hello, World!");    wcout << orig << " (_bstr_t)" << endl;
 14    // Convert to a char*    const size_t newsize = 100;    char nstring[newsize];    strcpy_s(nstring, (char *)orig);    strcat_s(nstring, " (char *)");    cout << nstring << endl;
 15    // Convert to a wchar_t*    wchar_t wcstring[newsize];    wcscpy_s(wcstring, (wchar_t *)orig);    wcscat_s(wcstring, L" (wchar_t *)");    wcout << wcstring << endl;
 16    // Convert to a CComBSTR    CComBSTR ccombstr((char *)orig);    if (ccombstr.Append(L" (CComBSTR)") == S_OK)    {        CW2A printstr(ccombstr);        cout << printstr << endl;    }
 17    // Convert to a CString    CString cstring((char *)orig);    cstring += " (CString)";    cout << cstring << endl;
 18    // Convert to a basic_string    string basicstring((char *)orig);    basicstring += " (basic_string)";    cout << basicstring << endl;
 19    // Convert to a System::String    String ^systemstring = gcnew String((char *)orig);    systemstring += " (System::String)";    Console::WriteLine("{0}", systemstring);    delete systemstring;} 输出
 20Hello, World! (_bstr_t)Hello, World! (char *)Hello, World! (wchar_t *)Hello, World! (CComBSTR)Hello, World! (CString)Hello, World! (basic_string)Hello, World! (System::String) 
 21从 CComBSTR 转换
 22 
 23
 24示例
 25
 26说明
 27此示例演示如何从 CComBSTR 转换为上面列出的其他字符串类型。
 28
 29// convert_from_ccombstr.cpp// compile with /clr /link comsuppw.lib
 30#include <iostream>#include <stdlib.h>#include <string>
 31#include "atlbase.h"#include "atlstr.h"#include "comutil.h"#include "vcclr.h"
 32using namespace std;using namespace System;using namespace System::Runtime::InteropServices;
 33int main(){    CComBSTR orig("Hello, World!");    CW2A printstr(orig);    cout << printstr << " (CComBSTR)" << endl;
 34    // Convert to a char*    const size_t newsize = 100;    char nstring[newsize];    CW2A tmpstr1(orig);    strcpy_s(nstring, tmpstr1);    strcat_s(nstring, " (char *)");    cout << nstring << endl;
 35    // Convert to a wchar_t*    wchar_t wcstring[newsize];    wcscpy_s(wcstring, orig);    wcscat_s(wcstring, L" (wchar_t *)");    wcout << wcstring << endl;
 36    // Convert to a _bstr_t_bstr_t bstrt(orig);    bstrt += " (_bstr_t)";    cout << bstrt << endl;
 37    // Convert to a CString    CString cstring(orig);    cstring += " (CString)";    cout << cstring << endl;
 38    // Convert to a basic_string    wstring basicstring(orig);    basicstring += L" (basic_string)";    wcout << basicstring << endl;
 39    // Convert to a System::String    String ^systemstring = gcnew String(orig);    systemstring += " (System::String)";    Console::WriteLine("{0}", systemstring);    delete systemstring;} 输出
 40Hello, World! (CComBSTR)Hello, World! (char *)Hello, World! (wchar_t *)Hello, World! (_bstr_t)Hello, World! (CString)Hello, World! (basic_string)Hello, World! (System::String) 
 41从 CString 转换
 42 
 43
 44示例
 45
 46说明
 47此示例演示如何从 CString 转换为上面列出的其他字符串类型。
 48
 49// convert_from_cstring.cpp// compile with /clr /link comsuppw.lib
 50#include <iostream>#include <stdlib.h>#include <string>
 51#include "atlbase.h"#include "atlstr.h"#include "comutil.h"
 52using namespace std;using namespace System;
 53int main(){    CString orig("Hello, World!");    wcout << orig << " (CString)" << endl;
 54    // Convert to a char*    const size_t newsize = 100;    char nstring[newsize];    strcpy_s(nstring, orig);    strcat_s(nstring, " (char *)");    cout << nstring << endl;
 55    // Convert to a wchar_t*    // You must first convert to a char * for this to work.    size_t origsize = strlen(orig) + 1;    size_t convertedChars = 0;    wchar_t wcstring[newsize];    mbstowcs_s(&convertedChars, wcstring, origsize, orig, _TRUNCATE);    wcscat_s(wcstring, L" (wchar_t *)");    wcout << wcstring << endl;
 56    // Convert to a _bstr_t    _bstr_t bstrt(orig);    bstrt += " (_bstr_t)";    cout << bstrt << endl;
 57    // Convert to a CComBSTR    CComBSTR ccombstr(orig);    if (ccombstr.Append(L" (CComBSTR)") == S_OK)    {        CW2A printstr(ccombstr);        cout << printstr << endl;    }
 58    // Convert to a basic_string    string basicstring(orig);    basicstring += " (basic_string)";    cout << basicstring << endl;
 59    // Convert to a System::String    String ^systemstring = gcnew String(orig);    systemstring += " (System::String)";    Console::WriteLine("{0}", systemstring);    delete systemstring;} 输出
 60Hello, World! (CString)Hello, World! (char *)Hello, World! (wchar_t *)Hello, World! (_bstr_t)Hello, World! (CComBSTR)Hello, World! (basic_string)Hello, World! (System::String) 
 61从 basic_string 转换
 62 
 63
 64示例
 65
 66说明
 67此示例演示如何从 basic_string 转换为上面列出的其他字符串类型。
 68
 69// convert_from_basic_string.cpp// compile with /clr /link comsuppw.lib
 70#include <iostream>#include <stdlib.h>#include <string>
 71#include "atlbase.h"#include "atlstr.h"#include "comutil.h"
 72using namespace std;using namespace System;
 73int main(){    string orig("Hello, World!");    cout << orig << " (basic_string)" << endl;
 74    // Convert to a char*    const size_t newsize = 100;    char nstring[newsize];    strcpy_s(nstring, orig.c_str());    strcat_s(nstring, " (char *)");    cout << nstring << endl;
 75    // Convert to a wchar_t*    // You must first convert to a char * for this to work.    size_t origsize = strlen(orig.c_str()) + 1;    size_t convertedChars = 0;    wchar_t wcstring[newsize];    mbstowcs_s(&convertedChars, wcstring, origsize, orig.c_str(), _TRUNCATE);    wcscat_s(wcstring, L" (wchar_t *)");    wcout << wcstring << endl;
 76    // Convert to a _bstr_t    _bstr_t bstrt(orig.c_str());    bstrt += " (_bstr_t)";    cout << bstrt << endl;
 77    // Convert to a CComBSTR    CComBSTR ccombstr(orig.c_str());    if (ccombstr.Append(L" (CComBSTR)") == S_OK)    {        CW2A printstr(ccombstr);        cout << printstr << endl;    }
 78    // Convert to a CString    CString cstring(orig.c_str());    cstring += " (CString)";    cout << cstring << endl;
 79    // Convert to a System::String    String ^systemstring = gcnew String(orig.c_str());    systemstring += " (System::String)";    Console::WriteLine("{0}", systemstring);    delete systemstring;}输出
 80 
 81
 82 
 83
 84Hello, World! (basic_string)Hello, World! (char *)Hello, World! (wchar_t *)Hello, World! (_bstr_t)Hello, World! (CComBSTR)Hello, World! (CString)Hello, World! (System::String) 
 85从 System::String 转换
 86 
 87
 88示例
 89
 90说明
 91此示例演示如何从 System.String 转换为上面列出的其他字符串类型。
 92
 93// convert_from_system_string.cpp// compile with /clr /link comsuppw.lib
 94#include <iostream>#include <stdlib.h>#include <string>
 95#include "atlbase.h"#include "atlstr.h"#include "comutil.h"#include "vcclr.h"
 96using namespace std;using namespace System;using namespace System::Runtime::InteropServices;
 97int main(){    String ^orig = gcnew String("Hello, World!");    Console::WriteLine("{0} (System::String)", orig);
 98    pin_ptr<const wchar_t> wch = PtrToStringChars(orig);
 99    // Convert to a char*    size_t origsize = wcslen(wch) + 1;    const size_t newsize = 100;    size_t convertedChars = 0;     char nstring[newsize];    wcstombs_s(&convertedChars, nstring, origsize, wch, _TRUNCATE);    strcat_s(nstring, " (char *)");    cout << nstring << endl;
100    // Convert to a wchar_t*    wchar_t wcstring[newsize];    wcscpy_s(wcstring, wch);    wcscat_s(wcstring, L" (wchar_t *)");    wcout << wcstring << endl;
101    // Convert to a _bstr_t    _bstr_t bstrt(wch);    bstrt += " (_bstr_t)";    cout << bstrt << endl;
102// Convert to a CComBSTR
103    CComBSTR ccombstr(wch);    if (ccombstr.Append(L" (CComBSTR)"== S_OK)    {        CW2A printstr(ccombstr);        cout << printstr << endl;    }
104    // Convert to a CString    CString cstring(wch);    cstring += " (CString)";    cout << cstring << endl;
105    // Convert to a basic_string    wstring basicstring(wch);    basicstring += L" (basic_string)";    wcout << basicstring << endl;
106    delete orig;}
 输出
107Hello, World! (System::String)Hello, World! (char *)Hello, World! (wchar_t *)Hello, World! (_bstr_t)Hello, World! (CComBSTR)Hello, World! (CString)Hello, World! (basic_string)

你可能感兴趣的:(对有关数据类型转换的整理)