C 文字列操作 新しいページはコチラ
提供: yonewiki
(→文字列の型変換) |
(→文字列の型変換) |
||
1,120行: | 1,120行: | ||
というわけで、これくらいできて当然という変換をやってみます。 | というわけで、これくらいできて当然という変換をやってみます。 | ||
+ | <syntaxhighlight lang="cpp" line start="1"> | ||
+ | #include <string> | ||
+ | #include <stdlib.h> | ||
+ | #include <iostream> | ||
+ | #include <tchar.h> | ||
+ | #include <mbstring.h> | ||
+ | #include "atlstr.h"//CString,CStringA,CStringWおよびLPTSTR,LPWSTR,LPSTR,LPCTSTR,LPCWSTR,LPCSTRの定義プリプロセッサ | ||
+ | #include "cstringt.h"//CStringTの定義プリプロセッサ | ||
+ | #include "atlbase.h" | ||
+ | |||
+ | //_bstr_t型を利用するプリプロセッサ | ||
+ | #include "comutil.h" | ||
+ | # ifdef _DEBUG | ||
+ | # pragma comment(lib, "comsuppwd.lib") | ||
+ | # else | ||
+ | # pragma comment(lib, "comsuppw.lib") | ||
+ | # endif | ||
+ | |||
+ | |||
+ | using namespace std; | ||
+ | using namespace System; | ||
+ | using namespace System::Runtime::InteropServices; | ||
+ | |||
+ | #include <tchar.h> | ||
+ | int main() { | ||
+ | _tsetlocale(LC_ALL, _T("Japanese")); | ||
+ | _locale_t locale; | ||
+ | locale = _create_locale(LC_ALL, "Japanese"); | ||
+ | |||
+ | //プロジェクトの設定の文字セットでunicode文字セットを使用するに設定しているので、TCHAR→wchar_t型と定義される。 | ||
+ | //プロジェクトの設定をかえるとTCHAR→char型になるので、設定によってはTCHAR型に変換する方式を切り替えないとダメ。 | ||
+ | //実際の変換処理は#ifdef UNICODEで分けた関数を作る必要がある。 | ||
+ | |||
+ | size_t *sizeReturnValue; | ||
+ | sizeReturnValue = new size_t; | ||
+ | |||
+ | const char *pcStrMoto[] ={"char型の変数 配列要素1","char型の変数 配列要素2"}; | ||
+ | const LPSTR pLPSTRStrMoto[] = {"LPSTR型の変数 配列要素1","LPSTR型の変数 配列要素2"}; | ||
+ | TCHAR **pptcStrCnv = new TCHAR*[sizeof(pcStrMoto)/sizeof(*pcStrMoto)]; | ||
+ | LPTSTR *ppLPTSTRStrCnv = new TCHAR*[sizeof(pcStrMoto)/sizeof(*pcStrMoto)]; | ||
+ | |||
+ | _tprintf(_T("文字列の型変換char→TCHAR\n")); | ||
+ | for(int i = 0; i < (sizeof(pcStrMoto)/sizeof(*pcStrMoto)); i++){ | ||
+ | |||
+ | #ifdef UNICODE | ||
+ | |||
+ | //配列要素i番目の変換後のサイズ取得処理と要素iの実体化と文字列長さ設定。 | ||
+ | mbstowcs_s(sizeReturnValue, NULL, 0,pcStrMoto[i], 0); | ||
+ | pptcStrCnv[i] = new TCHAR[*sizeReturnValue]; | ||
+ | ppLPTSTRStrCnv[i] = new TCHAR[*sizeReturnValue]; | ||
+ | //変換処理。 | ||
+ | mbstowcs_s(sizeReturnValue, pptcStrCnv[i], *sizeReturnValue, pcStrMoto[i], *sizeReturnValue); | ||
+ | mbstowcs_s(sizeReturnValue, ppLPTSTRStrCnv[i], *sizeReturnValue, pcStrMoto[i], *sizeReturnValue); | ||
+ | #else | ||
+ | |||
+ | //マルチバイト定義の場合はchar型同志のコピーになるので変換不要。 | ||
+ | pptcStrCnv[i] = new TCHAR[_tcslen(pcStrMoto[i]) + 1]; | ||
+ | ppLPTSTRStrCnv[i] = new TCHAR[_tcslen(pcStrMoto[i]) + 1]; | ||
+ | _tcscpy_s(pptcStrCnv[i],_tcslen(pcStrMoto[i]) + 1,pcStrMoto[i]); | ||
+ | _tcscpy_s(ppLPTSTRStrCnv[i],_tcslen(pcStrMoto[i]) + 1,pcStrMoto[i]); | ||
+ | |||
+ | #endif | ||
+ | //出力 | ||
+ | _tprintf(_T("要素[%d]\n"),i); | ||
+ | for(unsigned int j = 0; j < *sizeReturnValue; j++){ | ||
+ | _tprintf(_T("[%2d]=%x,"),j,*(*(pptcStrCnv + i) + j)); | ||
+ | } | ||
+ | _tprintf(_T("\n%s\n"),*(pptcStrCnv + i)); | ||
+ | } | ||
+ | |||
+ | _tprintf(_T("\n文字列の型変換TCHAR→char\n")); | ||
+ | const TCHAR *ptcStrMoto[] = {_T("TCHAR型の変数 配列要素1"),_T("TCHAR型の変数 配列要素2")}; | ||
+ | const LPTSTR pLPTSTRStrMoto[] = {_T("LPTSTR型の変数 配列要素1"),_T("LPTSTR型の変数 配列要素2")}; | ||
+ | char **ppcStrCnv = new char*[sizeof(ptcStrMoto)/sizeof(*ptcStrMoto)]; | ||
+ | LPSTR *ppLPSTRStrCnv = new char*[sizeof(ptcStrMoto)/sizeof(*ptcStrMoto)]; | ||
+ | |||
+ | for(int i = 0; i < (sizeof(ptcStrMoto)/sizeof(*ptcStrMoto)); i++){ | ||
+ | |||
+ | #ifdef UNICODE | ||
+ | |||
+ | //配列要素i番目の変換後のサイズ取得処理と要素iの実体化と文字列長さ設定。 | ||
+ | wcstombs_s(sizeReturnValue, NULL, 0,ptcStrMoto[i], 0); | ||
+ | ppcStrCnv[i] = new char[*sizeReturnValue]; | ||
+ | ppLPSTRStrCnv[i] = new char[*sizeReturnValue]; | ||
+ | //変換処理。 | ||
+ | wcstombs_s(sizeReturnValue, ppcStrCnv[i], *sizeReturnValue, ptcStrMoto[i], *sizeReturnValue); | ||
+ | wcstombs_s(sizeReturnValue, ppLPSTRStrCnv[i], *sizeReturnValue, ptcStrMoto[i], *sizeReturnValue); | ||
+ | #else | ||
+ | |||
+ | //マルチバイト定義の場合はchar型同志のコピーになるので変換不要。 | ||
+ | ppcStrCnv[i] = new TCHAR[_tcslen(ptcStrMoto[i]) + 1]; | ||
+ | ppLPSTRStrCnv[i] = new TCHAR[_tcslen(ptcStrMoto[i]) + 1]; | ||
+ | _tcscpy_s(ppcStrCnv[i],_tcslen(ptcStrMoto[i]) + 1,ptcStrMoto[i]); | ||
+ | _tcscpy_s(ppLPSTRStrCnv[i],_tcslen(ptcStrMoto[i]) + 1,ptcStrMoto[i]); | ||
+ | |||
+ | #endif | ||
+ | //出力 | ||
+ | _tprintf(_T("要素[%d]\n"),i); | ||
+ | for(unsigned int j = 0; j < *sizeReturnValue; j++){ | ||
+ | printf("[%2d]=%x,",j,*(*(ppcStrCnv + i) + j)); | ||
+ | printf("[%2d]=%x,",j,*(*(ppLPSTRStrCnv + i) + j)); | ||
+ | } | ||
+ | printf("\n%s\n",*(ppcStrCnv + i)); | ||
+ | printf("%s\n",*(ppLPSTRStrCnv + i)); | ||
+ | } | ||
+ | |||
+ | //_bstr_t,CComBSTR,CString,System::Stringいずれもcharの先頭アドレスを代入すれば格納できる。 | ||
+ | _tprintf(_T("\n文字列の型変換char→_bstr_t\n")); | ||
+ | _bstr_t bstrt[(sizeof(pcStrMoto)/sizeof(*pcStrMoto))]; | ||
+ | for(int i = 0; i < (sizeof(pcStrMoto)/sizeof(*pcStrMoto)); i++){ | ||
+ | bstrt[i] = pcStrMoto[i];//代入するだけ | ||
+ | std::cout << bstrt[i] << std::endl; | ||
+ | printf("_bstr_t %s\n",(LPCSTR)bstrt[i]); | ||
+ | } | ||
+ | |||
+ | _tprintf(_T("\n文字列の型変換char→CComBSTR\n")); | ||
+ | CComBSTR ccombstr[(sizeof(pcStrMoto)/sizeof(*pcStrMoto))]; | ||
+ | for(int i = 0; i < (sizeof(pcStrMoto)/sizeof(*pcStrMoto)); i++){ | ||
+ | ccombstr[i] = pcStrMoto[i];//代入するだけ | ||
+ | //マクロにより出力用の変数に文字列を移す必要がある。これはCComBSTR型の決まり。 | ||
+ | CW2A printstr(ccombstr[i]); | ||
+ | std::cout << printstr << std::endl; | ||
+ | printf("CComBSTR %s\n",printstr); | ||
+ | } | ||
+ | |||
+ | _tprintf(_T("\n文字列の型変換char→CStringA\n")); | ||
+ | CStringA cstringa[(sizeof(pcStrMoto)/sizeof(*pcStrMoto))]; | ||
+ | for(int i = 0; i < (sizeof(pcStrMoto)/sizeof(*pcStrMoto)); i++){ | ||
+ | cstringa[i] = pcStrMoto[i];//代入するだけ | ||
+ | std::cout << cstringa[i] << std::endl; | ||
+ | printf("CStringA %s\n",cstringa[i]); | ||
+ | } | ||
+ | |||
+ | _tprintf(_T("\n文字列の型変換char→CStringW\n")); | ||
+ | CStringW cstringw[(sizeof(pcStrMoto)/sizeof(*pcStrMoto))]; | ||
+ | for(int i = 0; i < (sizeof(pcStrMoto)/sizeof(*pcStrMoto)); i++){ | ||
+ | cstringw[i] = pcStrMoto[i];//代入するだけ | ||
+ | std::wcout << (LPCTSTR)cstringw[i] << std::endl; | ||
+ | _tprintf(_T("CStringW %s\n"),(LPCTSTR)cstringw[i]); | ||
+ | } | ||
+ | |||
+ | _tprintf(_T("\n文字列の型変換char→string\n")); | ||
+ | string basicstring[(sizeof(pcStrMoto)/sizeof(*pcStrMoto))]; | ||
+ | for(int i = 0; i < (sizeof(pcStrMoto)/sizeof(*pcStrMoto)); i++){ | ||
+ | basicstring[i] = pcStrMoto[i];//代入するだけ | ||
+ | cout << basicstring[i] << endl; | ||
+ | printf("string %s\n",basicstring[i].c_str()); | ||
+ | } | ||
+ | |||
+ | _tprintf(_T("\n文字列の型変換char→SystemString\n")); | ||
+ | |||
+ | array<String^> ^systemstring = gcnew array<String^>(sizeof(pcStrMoto)/sizeof(*pcStrMoto)); | ||
+ | for(int i = 0; i < (sizeof(pcStrMoto)/sizeof(*pcStrMoto)); i++){ | ||
+ | char* pcStrTemp = new char[strlen(pcStrMoto[i]) + 1]; | ||
+ | strcpy_s(pcStrTemp,strlen(pcStrMoto[i]) + 1,pcStrMoto[i]); | ||
+ | System::IntPtr ptr(pcStrTemp);//この関数がconst charの変換に対応していないので、上の2行でconst無しの変数に移し替えた。 | ||
+ | systemstring[i] = Marshal::PtrToStringAnsi(ptr);//IntPtrポインタを引数として変換するメソッド。 | ||
+ | Console::WriteLine("{0}", systemstring[i]); | ||
+ | delete[] pcStrTemp; | ||
+ | //printf("string %s\n",basicstring[i].c_str()); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
※2014/08/24 ここまでで、疲れたから、また暫くオヤスミ。次に気が向くのはいつになるのか、誰も知らない。 | ※2014/08/24 ここまでで、疲れたから、また暫くオヤスミ。次に気が向くのはいつになるのか、誰も知らない。 |