C 文字列操作 新しいページはコチラ
提供: yonewiki
(→文字列の型変換) |
(→文字列の型変換) |
||
1,595行: | 1,595行: | ||
上記のように変換を進めていて気づくことですが、それぞれの型は取り扱える文字体系が異なります。_bstr_tやCComBSTRはマルチバイト文字とワイド文字の両方に対応していて、プロジェクト設定にしたがって記憶する文字型を切り替えています。CStringAはマルチバイト文字、CStringWはワイド文字です。stringとSystem::Stringはマルチバイト文字を扱うようになっています。したがって、変換時にはマルチバイト文字、ワイド文字変換が必要になるケースと必要ないケース。あるいは、プロジェクトの設定によって決まるケースがあるわけです。そのことから、_bstr_tやCComBSTを利用しておくという、ある程度、文字列の世界を熟知している人だけが選ぶ道があるようにも思えるわけです。マイクロソフトの容易したものを使うにしても賢い選択というのが、その時代、時代によって存在することになります。開発するプログラムの枠組みによってはマルチバイトやワイド文字といった切り替えは気にしないという人もいるのかもしれません。それと、wchar_tとcharの変換をおぼえれば、それぞれの特殊な型をchar型に変換する手法とcharからそれぞれの型に変換する手法をマスターすれば、変換手順は長くなる可能性がありますが、とにかくすべてを網羅できるわけです。特殊な型から特殊な型へのダイレクトな変換は覚えなくてもなんとかなる。覚えた方が楽になる。そんな感じです。 | 上記のように変換を進めていて気づくことですが、それぞれの型は取り扱える文字体系が異なります。_bstr_tやCComBSTRはマルチバイト文字とワイド文字の両方に対応していて、プロジェクト設定にしたがって記憶する文字型を切り替えています。CStringAはマルチバイト文字、CStringWはワイド文字です。stringとSystem::Stringはマルチバイト文字を扱うようになっています。したがって、変換時にはマルチバイト文字、ワイド文字変換が必要になるケースと必要ないケース。あるいは、プロジェクトの設定によって決まるケースがあるわけです。そのことから、_bstr_tやCComBSTを利用しておくという、ある程度、文字列の世界を熟知している人だけが選ぶ道があるようにも思えるわけです。マイクロソフトの容易したものを使うにしても賢い選択というのが、その時代、時代によって存在することになります。開発するプログラムの枠組みによってはマルチバイトやワイド文字といった切り替えは気にしないという人もいるのかもしれません。それと、wchar_tとcharの変換をおぼえれば、それぞれの特殊な型をchar型に変換する手法とcharからそれぞれの型に変換する手法をマスターすれば、変換手順は長くなる可能性がありますが、とにかくすべてを網羅できるわけです。特殊な型から特殊な型へのダイレクトな変換は覚えなくてもなんとかなる。覚えた方が楽になる。そんな感じです。 | ||
+ | |||
+ | <syntaxhighlight lang="cpp" line start="1"> | ||
+ | //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ | ||
+ | //・CComBSTR→char | ||
+ | //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ | ||
+ | |||
+ | _tprintf(_T("\n文字列の型変換CComBSTR→char\n")); | ||
+ | |||
+ | const CComBSTR ccombstrOrigin[] = {_T("CComBSTR型の変数 配列要素1"),_T("CComBSTR型の変数 配列要素2"),_T("CComBSTR型の変数 配列要素3")}; | ||
+ | |||
+ | printf("%d\n", sizeof(*ccombstrOrigin)); | ||
+ | printf("%d\n", sizeof(ccombstrOrigin)); | ||
+ | |||
+ | *pnStrArrayElement = sizeof(ccombstrOrigin)/sizeof(*ccombstrOrigin); | ||
+ | |||
+ | ppcStrCnv = new char*[*pnStrArrayElement];//要素数分の大きさ+1を確保 | ||
+ | |||
+ | //変換 | ||
+ | for(int i = 0; i < *pnStrArrayElement; i++){ | ||
+ | CW2A strtemp(ccombstrOrigin[i]); | ||
+ | *sizeReturnValue = strlen(strtemp) + 1; | ||
+ | |||
+ | ppcStrCnv[i] = new char[*sizeReturnValue]; | ||
+ | |||
+ | strcpy_s(ppcStrCnv[i], *sizeReturnValue, strtemp); | ||
+ | } | ||
+ | |||
+ | //char出力 | ||
+ | for(int i = 0; i < *pnStrArrayElement; i++){ | ||
+ | printf("%s\n",*(ppcStrCnv + i)); | ||
+ | } | ||
+ | |||
+ | //動的確保変数の解放 | ||
+ | for(int i = 0;i < *pnStrArrayElement ;i++){ | ||
+ | delete[] *(ppcStrCnv + i); | ||
+ | } | ||
+ | delete[] ppcStrCnv; | ||
+ | |||
+ | |||
+ | //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ | ||
+ | //・CComBSTR→TCHAR | ||
+ | //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ | ||
+ | |||
+ | _tprintf(_T("\n文字列の型変換CComBSTR→TCHAR\n")); | ||
+ | |||
+ | pptcStrCnv = new TCHAR*[*pnStrArrayElement];//要素数分の大きさ+1を確保 | ||
+ | |||
+ | //変換 | ||
+ | for(int i = 0; i < *pnStrArrayElement; i++){ | ||
+ | |||
+ | #ifdef UNICODE | ||
+ | *sizeReturnValue = _tcslen(ccombstrOrigin[i]) + 1; | ||
+ | pptcStrCnv[i] = new TCHAR[*sizeReturnValue]; | ||
+ | _tcscpy_s(pptcStrCnv[i], *sizeReturnValue, ccombstrOrigin[i]); | ||
+ | #else | ||
+ | CW2A strtemp(ccombstrOrigin[i]); | ||
+ | *sizeReturnValue = strlen(strtemp) + 1; | ||
+ | pptcStrCnv[i] = new TCHAR[*sizeReturnValue]; | ||
+ | _tcscpy_s(pptcStrCnv[i], *sizeReturnValue, strtemp); | ||
+ | #endif | ||
+ | } | ||
+ | |||
+ | //char出力 | ||
+ | for(int i = 0; i < *pnStrArrayElement; i++){ | ||
+ | _tprintf(_T("%s\n"),*(pptcStrCnv + i)); | ||
+ | } | ||
+ | |||
+ | //動的確保変数の解放 | ||
+ | for(int i = 0;i < *pnStrArrayElement ;i++){ | ||
+ | delete[] *(pptcStrCnv + i); | ||
+ | } | ||
+ | delete[] pptcStrCnv; | ||
+ | |||
+ | //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ | ||
+ | //・CComBSTR→_bstr_t(マルチバイト文字) | ||
+ | //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ | ||
+ | |||
+ | _tprintf(_T("\n文字列の型変換_bstr_t→CComBSTR\n")); | ||
+ | |||
+ | _bstr_t *pbstrt_StrCnv = new _bstr_t[*pnStrArrayElement];//要素数分の大きさ+1を確保 | ||
+ | |||
+ | //変換 | ||
+ | for(int i = 0; i < *pnStrArrayElement; i++){ | ||
+ | CW2A strtemp(ccombstrOrigin[i]); | ||
+ | pbstrt_StrCnv[i] = strtemp; | ||
+ | } | ||
+ | |||
+ | //出力 | ||
+ | for(int i = 0; i < *pnStrArrayElement; i++){ | ||
+ | //無変換出力 | ||
+ | printf("%s\n",(char*)pbstrt_StrCnv[i]); | ||
+ | _tprintf(_T("%s\n"),(wchar_t*)pbstrt_StrCnv[i]); | ||
+ | } | ||
+ | |||
+ | //動的確保変数の解放 | ||
+ | delete[] pbstrt_StrCnv; | ||
+ | |||
+ | //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ | ||
+ | //・CComBSTR→CStringA(マルチバイト文字) | ||
+ | //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ | ||
+ | |||
+ | _tprintf(_T("\n文字列の型変換CComBSTR→CStringA\n")); | ||
+ | |||
+ | pcstringa_StrCnv = new CStringA[*pnStrArrayElement];//要素数分の大きさ+1を確保 | ||
+ | |||
+ | //変換 | ||
+ | for(int i = 0; i < *pnStrArrayElement; i++){ | ||
+ | CW2A strtemp(ccombstrOrigin[i]); | ||
+ | pcstringa_StrCnv[i] = strtemp; | ||
+ | } | ||
+ | |||
+ | //出力 | ||
+ | for(int i = 0; i < *pnStrArrayElement; i++){ | ||
+ | //char変換出力 | ||
+ | printf("%s\n",pcstringa_StrCnv[i]); | ||
+ | } | ||
+ | |||
+ | //動的確保変数の解放 | ||
+ | delete[] pcstringa_StrCnv; | ||
+ | |||
+ | //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ | ||
+ | //・CComBSTR→CStringW(ワイド文字) | ||
+ | //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ | ||
+ | |||
+ | _tprintf(_T("\n文字列の型変換CComBSTR→CStringW\n")); | ||
+ | |||
+ | pcstringw_StrCnv = new CStringW[*pnStrArrayElement];//要素数分の大きさ+1を確保 | ||
+ | |||
+ | //変換 | ||
+ | for(int i = 0; i < *pnStrArrayElement; i++){ | ||
+ | CW2A strtemp(ccombstrOrigin[i]); | ||
+ | pcstringw_StrCnv[i] = strtemp; | ||
+ | } | ||
+ | |||
+ | //出力 | ||
+ | for(int i = 0; i < *pnStrArrayElement; i++){ | ||
+ | //wchar_t出力 | ||
+ | wprintf(L"%s\n",pcstringw_StrCnv[i]); | ||
+ | } | ||
+ | |||
+ | //動的確保変数の解放 | ||
+ | delete[] pcstringw_StrCnv; | ||
+ | |||
+ | //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ | ||
+ | //・CComBSTR→string(マルチバイト文字) | ||
+ | //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ | ||
+ | |||
+ | _tprintf(_T("\n文字列の型変換CComBSTR→string\n")); | ||
+ | |||
+ | pstring_StrCnv = new string[*pnStrArrayElement];//要素数分の大きさ+1を確保 | ||
+ | |||
+ | //変換 | ||
+ | for(int i = 0; i < *pnStrArrayElement; i++){ | ||
+ | CW2A strtemp(ccombstrOrigin[i]); | ||
+ | pstring_StrCnv[i] = strtemp; | ||
+ | } | ||
+ | |||
+ | //出力 | ||
+ | for(int i = 0; i < *pnStrArrayElement; i++){ | ||
+ | //char変換出力 | ||
+ | printf("%s\n",pstring_StrCnv[i].c_str()); | ||
+ | } | ||
+ | |||
+ | //動的確保変数の解放 | ||
+ | delete[] pstring_StrCnv; | ||
+ | |||
+ | |||
+ | //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ | ||
+ | //・CComBSTR→SystemString(マルチバイト文字) | ||
+ | //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ | ||
+ | |||
+ | _tprintf(_T("\n文字列の型変換CComBSTR→SystemString\n")); | ||
+ | |||
+ | psysstring_StrCnv = gcnew array<String^>(*pnStrArrayElement); | ||
+ | //変換 | ||
+ | for(int i = 0; i < *pnStrArrayElement; i++){ | ||
+ | CW2A strtemp(ccombstrOrigin[i]); | ||
+ | |||
+ | System::IntPtr ptr(strtemp); | ||
+ | psysstring_StrCnv[i] = Marshal::PtrToStringAnsi(ptr); | ||
+ | } | ||
+ | |||
+ | //出力 | ||
+ | for(int i = 0; i < *pnStrArrayElement; i++){ | ||
+ | //char変換出力 | ||
+ | printf("%s\n",psysstring_StrCnv[i]); | ||
+ | //TCHAR変換出力 | ||
+ | #ifdef UNICODE | ||
+ | _tprintf(_T("%s\n"),PtrToStringChars(psysstring_StrCnv[i])); | ||
+ | #else | ||
+ | _tprintf(_T("%s\n"),psysstring_StrCnv[i]); | ||
+ | #endif | ||
+ | } | ||
+ | |||
+ | //動的確保変数の解放 | ||
+ | delete[] psysstring_StrCnv; | ||
+ | </syntaxhighlight> | ||
引き続き、変換のサンプルを記述していきます。残るはCComBSTR、CStringA、CStringW、string、System::String基準の変換ですね。 | 引き続き、変換のサンプルを記述していきます。残るはCComBSTR、CStringA、CStringW、string、System::String基準の変換ですね。 |