Thinkfeng的C++

Thinkfeng的C++
posts - 2, comments - 0, trackbacks - 0, articles - 8
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

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

Posted on 2008-12-05 19:08 Thinkfeng 阅读(404) 评论(0)  编辑 收藏 引用

 

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

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

二、字符串转换为其它数据类型
 1strcpy(temp,"123"); 
 2
 3短整型(int
 4= atoi(temp); 
 5长整型(long
 6= atol(temp); 
 7浮点(double
 8= atof(temp); 
 9CString变量 
10CString name = temp; 
11BSTR变量 
12BSTR bstrValue = ::SysAllocString(L"程序员"); 
13///完成对bstrValue的使用
14SysFreeString(bstrValue); 
15
16CComBSTR变量 
17CComBSTR类型变量可以直接赋值
18CComBSTR bstrVar1("test");
19CComBSTR 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)
 5str.Format("%d",i); 
 6浮点数(float)
 7str.Format("%f",i); 
 8字符串指针(char *)等已经被CString构造函数支持的数据类型可以直接赋值
 9str = username; 
10对于Format所不支持的数据类型,可以通过上面所说的关于其它数据类型转化到char *的方法先转到char *,然后赋值给CString变量。

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

五、VARIANT 、_variant_t 与 COleVariant

 1VARIANT的结构可以参考头文件VC98\Include\OAIDL.H中关于结构体tagVARIANT的定义。
 2对于VARIANT变量的赋值:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子:
 3VARIANT va;
 4int a=2001;
 5va.vt=VT_I4;///指明整型数据
 6va.lVal=a; ///赋值 
 7  
 8  
 9_variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。
10使用时需加上#include <comdef.h>
11例如:
12long l=222;
13ing i=100;
14_variant_t lVal(l);
15lVal = (long)i; 
16
17COleVariant的使用与_variant_t的方法基本一样,请参考如下例子:
18COleVariant v3 = "字符串", v4 = (long)1999;
19CString str =(BSTR)v3.pbstrVal;
20long 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>
 5include <stdlib.h>#include <string>
 6#include "atlbase.h"#include "atlstr.h"#include "comutil.h"
 7using namespace std;using namespace System;
 8int 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//输出
2Hello, World! (char *)
3Hello, World! (wchar_t *)
4Hello, World! (_bstr_t)
5Hello, World! (CComBSTR)
6Hello, World! (CString)
7Hello, World! (basic_string)
8Hello, 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"
 6using namespace std;using namespace System;
 7int 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"
 12using namespace std;using namespace System;
 13int 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)


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理