煩わしいタイプ変換


データ型変換に関する整理


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に入れ、最後の数字は10進itoa(i,temp,2);//バイナリ変換
  • 長整型(long)ltoa(l,temp,10);
  • 浮動小数点数(float,double)はfcvtで変換を完了することができ、これはMSDNの例であるint decimal,sign;char *buffer; double source = 3.1415926535; buffer = _fcvt( source, 7, &decimal, &sign ); 実行結果:source:3.1415926535 buffer:'31415927'decimal:1 sign:0 decimalは小数点の位置を表し、signは記号:0は正数、1は負数
  • を表す
  • CString変数str=「2008北京オリンピック」buf = (LPSTR)(LPCTSTR)str;
  • BSTR変数BSTR bstrValue=::SysAllocString(L"プログラマ");char * buf = _com_util::ConvertBSTRToString(bstrValue); SysFreeString(bstrValue); AfxMessageBox(buf); delete(buf);
  • CComBSTR変数CComBSTR bstrVar(「test」)char *buf = _com_util::ConvertBSTRToString(bstrVar.m_str); AfxMessageBox(buf); delete(buf);
  • _bstr_t変数_bstr_tタイプはBSTRのカプセル化であり、=オペレータがリロードされているので使いやすい_bstr_t bstrVar("test"); const char *buf = bstrVar;///bufの内容AfxMessageBox(buf)を変更しないでください.
  • 汎用メソッド(非COMデータ型の場合)sprintfで変換
    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); 
  • を完了する.
    二、文字列を他のデータ型strcpy(temp、「123」)に変換する.
  • 短整型(int)i=atoi(temp);
  • 長整型(long)l=atol(temp);
  • 浮動小数点(double)d=atof(temp);
  • CString変数CString name=temp;
  • BSTR変数BSTR bstrValue=::SysAllocString(L"プログラマ");...///bstrValueの使用を完了するSysFreeString(bstrValue);
  • CComBSTR変数CComBSTRタイプ変数は、CComBSTR bstrVar 1(「test」)を直接付与することができる.CComBSTR bstrVar2(temp);
  • _bstr_t変数_bstr_tタイプの変数は直接値を割り当てることができる_bstr_t bstrVar1("test"); _bstr_t bstrVar2(temp);

  • 三、その他のデータ型からCStringへの変換CStringのメンバー関数Formatを使用して変換する.例えば:
  • 整数(int)str.Format("%d",i);
  • 浮動小数点数(float)str.Format("%f",i);
  • 文字列ポインタ(char*)などCStringコンストラクタでサポートされているデータ型はstr=usernameを直接付与することができる.
  • Formatでサポートされていないデータ型については、前述した他のデータ型をchar*に変換する方法でchar*に移動し、CString変数に値を割り当てることができます.

  • 四、BSTR、bstr_tとCComBSTR
  • CComBSTRはATL対BSTRのパッケージである.bstr_tはC++対BSTRのパッケージであり,BSTRは32ビットポインタであるが,文字列のバッファ領域を直接指すものではない.char*からBSTRへの変換は、BSTR b=com_util::ConvertStringToBSTR("データ");//使用前にcomutilを付ける必要がある.hとcomsupp.libSysFreeString(bstrValue); 逆にchar*p=_を使用できますcom_util::ConvertBSTRToString(b);delete p;具体的には1、2段落の具体的な説明を参考にすることができます.CComBSTRと_bstr_tは大量のオペレータをリロードし,直接=,!=,==を行うことができる.などの操作ができるので、とても便利です.特に_bstr_t、それを使うことをお勧めします.

  • 五、VARIANT、variant_tとCOleVariant
  • VARIANTの構成は、ヘッダファイルVC 98/Include/OAIDLを参照することができる.Hにおける構造体tagVARIANTの定義.VARIANT変数に対する付与:まずvtメンバーに付与し、データ型を指定し、連合構造における同じデータ型の変数に付与し、例を挙げると、VARIANT va;int a=2001;va.vt=VT_I4;///整数データva.lVal=a;//割り当て
  •  
  •  
  • _variant_tはVARIANTのパッケージクラスであり、その付与値は強制タイプ変換を使用することができ、その構築関数はこれらのデータ型を自動的に処理する.使用には#include例えば、long l=222;ing i=100;_variant_t lVal(l);lVal = (long)i;
  • COleVariantの使用と_variant_tの方法は基本的に同じですが、COleVariant v 3=「文字列」、v 4=(long)1999を参照してください.CString str =(BSTR)v3.pbstrVal;long i = v4.lVal;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  • このトピックでは、さまざまなC++文字列タイプを別の文字列に変換する方法を示します.変換可能な文字列タイプにはchar*、wchar_が含まれます.t*、_bstr_t、CComBSTR、CString、basic_stringとSystemString.すべての場合、文字列を新しいタイプに変換すると、文字列のコピーが作成されます.新しい文字列に対する変更は、元の文字列には影響しません.逆も同様です.

    char*から変換



    説明


    この例では、char*から上記の他の文字列タイプに変換する方法を示します.
    // convert_from_char.cpp
    // compile with /clr /link comsuppw.lib
    
    #include <iostream>
    #include <stdlib.h>
    #include <string>
    
    #include "atlbase.h"
    #include "atlstr.h"
    #include "comutil.h"
    
    using namespace std;
    using namespace System;
    
    int main()
    {
        char *orig = "Hello, World!";
        cout << orig << " (char *)" << endl;
    
        // 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;
    
        // Convert to a _bstr_t
        _bstr_t bstrt(orig);
        bstrt += " (_bstr_t)";
        cout << bstrt << endl;
    
        // Convert to a CComBSTR
        CComBSTR ccombstr(orig);
        if (ccombstr.Append(L" (CComBSTR)") == S_OK)
        {
            CW2A printstr(ccombstr);
            cout << printstr << endl;
        }
    
        // Convert to a CString
        CString cstring(orig);
        cstring += " (CString)";
        cout << cstring << endl;
    
        // Convert to a basic_string
        string basicstring(orig);
        basicstring += " (basic_string)";
        cout << basicstring << endl;
    
        // Convert to a System::String
        String ^systemstring = gcnew String(orig);
        systemstring += " (System::String)";
        Console::WriteLine("{0}", systemstring);
        delete systemstring;
    }

    しゅつりょく

    Hello, World! (char *)
    Hello, World! (wchar_t *)
    Hello, World! (_bstr_t)
    Hello, World! (CComBSTR)
    Hello, World! (CString)
    Hello, World! (basic_string)
    Hello, World! (System::String)

    wchar_からt*変換



    説明


    この例では、wchar_からt*は、上記の他の文字列タイプに変換されます.
    // convert_from_wchar_t.cpp
    // compile with /clr /link comsuppw.lib
    
    #include <iostream>
    #include <stdlib.h>
    #include <string>
    
    #include "atlbase.h"
    #include "atlstr.h"
    #include "comutil.h"
    
    using namespace std;
    using namespace System;
    
    int main()
    {
        wchar_t *orig = L"Hello, World!";
        wcout << orig << L" (wchar_t *)" << endl;
    
        // 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;
    
        // Convert to a _bstr_t
        _bstr_t bstrt(orig);
        bstrt += " (_bstr_t)";
        cout << bstrt << endl;
    
        // Convert to a CComBSTR
        CComBSTR ccombstr(orig);
        if (ccombstr.Append(L" (CComBSTR)") == S_OK)
        {
            CW2A printstr(ccombstr);
            cout << printstr << endl;
        }
    
        // Convert to a CString
        CString cstring(orig);
        cstring += " (CString)";
        cout << cstring << endl;
    
        // Convert to a basic_string
        wstring basicstring(orig);
        basicstring += L" (basic_string)";
        wcout << basicstring << endl;
    
        // Convert to a System::String
        String ^systemstring = gcnew String(orig);
        systemstring += " (System::String)";
        Console::WriteLine("{0}", systemstring);
        delete systemstring;
    }

    しゅつりょく

    Hello, World! (wchar_t *)
    Hello, World! (char *)
    Hello, World! (_bstr_t)
    Hello, World! (CComBSTR)
    Hello, World! (CString)
    Hello, World! (basic_string)
    Hello, World! (System::String)

    からbstr_t変換



    説明


    次の例では、_bstr_tは、上記の他の文字列タイプに変換される.
    // convert_from_bstr_t.cpp
    // compile with /clr /link comsuppw.lib
    
    #include <iostream>
    #include <stdlib.h>
    #include <string>
    
    #include "atlbase.h"
    #include "atlstr.h"
    #include "comutil.h"
    
    using namespace std;
    using namespace System;
    
    int main()
    {
        _bstr_t orig("Hello, World!");
        wcout << orig << " (_bstr_t)" << endl;
    
        // Convert to a char*
        const size_t newsize = 100;
        char nstring[newsize];
        strcpy_s(nstring, (char *)orig);
        strcat_s(nstring, " (char *)");
        cout << nstring << endl;
    
        // Convert to a wchar_t*
        wchar_t wcstring[newsize];
        wcscpy_s(wcstring, (wchar_t *)orig);
        wcscat_s(wcstring, L" (wchar_t *)");
        wcout << wcstring << endl;
    
        // Convert to a CComBSTR
        CComBSTR ccombstr((char *)orig);
        if (ccombstr.Append(L" (CComBSTR)") == S_OK)
        {
            CW2A printstr(ccombstr);
            cout << printstr << endl;
        }
    
        // Convert to a CString
        CString cstring((char *)orig);
        cstring += " (CString)";
        cout << cstring << endl;
    
        // Convert to a basic_string
        string basicstring((char *)orig);
        basicstring += " (basic_string)";
        cout << basicstring << endl;
    
        // Convert to a System::String
        String ^systemstring = gcnew String((char *)orig);
        systemstring += " (System::String)";
        Console::WriteLine("{0}", systemstring);
        delete systemstring;
    }

    しゅつりょく

    Hello, World! (_bstr_t)
    Hello, World! (char *)
    Hello, World! (wchar_t *)
    Hello, World! (CComBSTR)
    Hello, World! (CString)
    Hello, World! (basic_string)
    Hello, World! (System::String)

    CComBSTRからの変換



    説明


    この例では、CComBSTRから上記の他の文字列タイプに変換する方法を示します.
    // convert_from_ccombstr.cpp
    // compile with /clr /link comsuppw.lib
    
    #include <iostream>
    #include <stdlib.h>
    #include <string>
    
    #include "atlbase.h"
    #include "atlstr.h"
    #include "comutil.h"
    #include "vcclr.h"
    
    using namespace std;
    using namespace System;
    using namespace System::Runtime::InteropServices;
    
    int main()
    {
        CComBSTR orig("Hello, World!");
        CW2A printstr(orig);
        cout << printstr << " (CComBSTR)" << endl;
    
        // 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;
    
        // Convert to a wchar_t*
        wchar_t wcstring[newsize];
        wcscpy_s(wcstring, orig);
        wcscat_s(wcstring, L" (wchar_t *)");
        wcout << wcstring << endl;
    
        // Convert to a _bstr_t
        _bstr_t bstrt(orig);
        bstrt += " (_bstr_t)";
        cout << bstrt << endl;
    
        // Convert to a CString
        CString cstring(orig);
        cstring += " (CString)";
        cout << cstring << endl;
    
        // Convert to a basic_string
        wstring basicstring(orig);
        basicstring += L" (basic_string)";
        wcout << basicstring << endl;
    
        // Convert to a System::String
        String ^systemstring = gcnew String(orig);
        systemstring += " (System::String)";
        Console::WriteLine("{0}", systemstring);
        delete systemstring;
    }

    しゅつりょく

    Hello, World! (CComBSTR)
    Hello, World! (char *)
    Hello, World! (wchar_t *)
    Hello, World! (_bstr_t)
    Hello, World! (CString)
    Hello, World! (basic_string)
    Hello, World! (System::String)

    CStringからの変換



    説明


    この例では、CStringから上記の他の文字列タイプに変換する方法を示します.
    // convert_from_cstring.cpp
    // compile with /clr /link comsuppw.lib
    
    #include <iostream>
    #include <stdlib.h>
    #include <string>
    
    #include "atlbase.h"
    #include "atlstr.h"
    #include "comutil.h"
    
    using namespace std;
    using namespace System;
    
    int main()
    {
        CString orig("Hello, World!");
        wcout << orig << " (CString)" << endl;
    
        // Convert to a char*
        const size_t newsize = 100;
        char nstring[newsize];
        strcpy_s(nstring, orig);
        strcat_s(nstring, " (char *)");
        cout << nstring << endl;
    
        // 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;
    
        // Convert to a _bstr_t
        _bstr_t bstrt(orig);
        bstrt += " (_bstr_t)";
        cout << bstrt << endl;
    
        // Convert to a CComBSTR
        CComBSTR ccombstr(orig);
        if (ccombstr.Append(L" (CComBSTR)") == S_OK)
        {
            CW2A printstr(ccombstr);
            cout << printstr << endl;
        }
    
        // Convert to a basic_string
        string basicstring(orig);
        basicstring += " (basic_string)";
        cout << basicstring << endl;
    
        // Convert to a System::String
        String ^systemstring = gcnew String(orig);
        systemstring += " (System::String)";
        Console::WriteLine("{0}", systemstring);
        delete systemstring;
    }

    しゅつりょく

    Hello, World! (CString)
    Hello, World! (char *)
    Hello, World! (wchar_t *)
    Hello, World! (_bstr_t)
    Hello, World! (CComBSTR)
    Hello, World! (basic_string)
    Hello, World! (System::String)

    basic_からstring変換



    説明


    この例ではbasic_からstringは、上記の他の文字列タイプに変換されます.
    // convert_from_basic_string.cpp
    // compile with /clr /link comsuppw.lib
    
    #include <iostream>
    #include <stdlib.h>
    #include <string>
    
    #include "atlbase.h"
    #include "atlstr.h"
    #include "comutil.h"
    
    using namespace std;
    using namespace System;
    
    int main()
    {
        string orig("Hello, World!");
        cout << orig << " (basic_string)" << endl;
    
        // 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;
    
        // 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;
    
        // Convert to a _bstr_t
        _bstr_t bstrt(orig.c_str());
        bstrt += " (_bstr_t)";
        cout << bstrt << endl;
    
        // Convert to a CComBSTR
        CComBSTR ccombstr(orig.c_str());
        if (ccombstr.Append(L" (CComBSTR)") == S_OK)
        {
            CW2A printstr(ccombstr);
            cout << printstr << endl;
        }
    
        // Convert to a CString
        CString cstring(orig.c_str());
        cstring += " (CString)";
        cout << cstring << endl;
    
        // Convert to a System::String
        String ^systemstring = gcnew String(orig.c_str());
        systemstring += " (System::String)";
        Console::WriteLine("{0}", systemstring);
        delete systemstring;
    }

    しゅつりょく

    Hello, World! (basic_string)
    Hello, World! (char *)
    Hello, World! (wchar_t *)
    Hello, World! (_bstr_t)
    Hello, World! (CComBSTR)
    Hello, World! (CString)
    Hello, World! (System::String)

    System::Stringから変換



    説明


    この例では、System.Stringは、上記の他の文字列タイプに変換されます.
    // convert_from_system_string.cpp
    // compile with /clr /link comsuppw.lib
    
    #include <iostream>
    #include <stdlib.h>
    #include <string>
    
    #include "atlbase.h"
    #include "atlstr.h"
    #include "comutil.h"
    #include "vcclr.h"
    
    using namespace std;
    using namespace System;
    using namespace System::Runtime::InteropServices;
    
    int main()
    {
        String ^orig = gcnew String("Hello, World!");
        Console::WriteLine("{0} (System::String)", orig);
    
        pin_ptr<const wchar_t> wch = PtrToStringChars(orig);
    
        // 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;
    
        // Convert to a wchar_t*
        wchar_t wcstring[newsize];
        wcscpy_s(wcstring, wch);
        wcscat_s(wcstring, L" (wchar_t *)");
        wcout << wcstring << endl;
    
        // Convert to a _bstr_t
        _bstr_t bstrt(wch);
        bstrt += " (_bstr_t)";
        cout << bstrt << endl;
    
        // Convert to a CComBSTR
        CComBSTR ccombstr(wch);
        if (ccombstr.Append(L" (CComBSTR)") == S_OK)
        {
            CW2A printstr(ccombstr);
            cout << printstr << endl;
        }
    
        // Convert to a CString
        CString cstring(wch);
        cstring += " (CString)";
        cout << cstring << endl;
    
        // Convert to a basic_string
        wstring basicstring(wch);
        basicstring += L" (basic_string)";
        wcout << basicstring << endl;
    
        delete orig;
    }

    しゅつりょく

    Hello, World! (System::String)
    Hello, World! (char *)
    Hello, World! (wchar_t *)
    Hello, World! (_bstr_t)
    Hello, World! (CComBSTR)
    Hello, World! (CString)
    Hello, World! (basic_string)