C 文字列操作 新しいページはコチラ
提供: yonewiki
(→文字列の型変換) |
(→文字列の型変換) |
||
1,315行: | 1,315行: | ||
VisualStudioのコードインテリセンスを有効にしたままC++とC++/CLI(共通言語)の勉強したい場合は、C++/CLIプロジェクトでもC++言語は使えるので、プロジェクトの作成からやりなおしてみると良いです。 | VisualStudioのコードインテリセンスを有効にしたままC++とC++/CLI(共通言語)の勉強したい場合は、C++/CLIプロジェクトでもC++言語は使えるので、プロジェクトの作成からやりなおしてみると良いです。 | ||
+ | <syntaxhighlight lang="cpp" line start="1"> | ||
+ | _tsetlocale(LC_ALL, _T("Japanese")); | ||
+ | _locale_t locale; | ||
+ | locale = _create_locale(LC_ALL, "Japanese"); | ||
+ | const char *pcStrMoto[] ={"char型の変数 配列要素1","char型の変数 配列要素2"}; | ||
+ | const LPSTR pLPSTRStrMoto[] = {"LPSTR型の変数 配列要素1","LPSTR型の変数 配列要素2"}; | ||
+ | |||
+ | const TCHAR *ptcStrMoto[] = {_T("TCHAR型の変数 要素1"),_T("TCHAR型の変数 要素2")}; | ||
+ | const LPTSTR pLPTSTRStrMoto[] = {_T("LPTSTR型の変数 要素1"),_T("LPTSTR型の変数 要素2")}; | ||
+ | |||
+ | size_t *sizeReturnValue; | ||
+ | sizeReturnValue = new size_t; | ||
+ | |||
+ | int *pnStrArrayElement; | ||
+ | pnStrArrayElement = new int; | ||
+ | |||
+ | *pnStrArrayElement = sizeof(ptcStrMoto)/sizeof(*ptcStrMoto); | ||
+ | |||
+ | //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ | ||
+ | //・TCHAR→char変換 | ||
+ | //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ | ||
+ | |||
+ | _tprintf(_T("文字列の型変換TCHAR→char\n")); | ||
+ | |||
+ | char **ppcStrCnv = new char*[*pnStrArrayElement];//要素数分の大きさ+1を確保 | ||
+ | LPSTR *ppLPSTRStrCnv = new char*[*pnStrArrayElement];//要素数分の大きさ+1を確保 | ||
+ | |||
+ | #ifdef UNICODE | ||
+ | //変換 | ||
+ | for(int i = 0; i < *pnStrArrayElement; 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 | ||
+ | //無変換 | ||
+ | for(int i = 0; i < *pnStrArrayElement; i++){ | ||
+ | |||
+ | ppcStrCnv[i] = new char[*sizeReturnValue]; | ||
+ | ppLPSTRStrCnv[i] = new char[*sizeReturnValue]; | ||
+ | |||
+ | _tcscpy_s(ppcStrCnv[i], _tcslen(ptcStrMoto[i]) + 1, ptcStrMoto[i]); | ||
+ | _tcscpy_s(ppLPSTRStrCnv[i], _tcslen(ptcStrMoto[i]) + 1, ptcStrMoto[i]); | ||
+ | |||
+ | } | ||
+ | #endif | ||
+ | //char出力 | ||
+ | for(int i = 0; i < *pnStrArrayElement; i++){ | ||
+ | printf("%s\n",*(ppcStrCnv + i)); | ||
+ | } | ||
+ | //LPSTR出力 | ||
+ | for(int i = 0; i < *pnStrArrayElement; i++){ | ||
+ | printf("%s\n",*(ppLPSTRStrCnv + i)); | ||
+ | } | ||
+ | |||
+ | printf("%d\n", sizeof(**ppcStrCnv)); | ||
+ | printf("%d\n", sizeof(*ppcStrCnv)); | ||
+ | printf("%d\n", sizeof(ppcStrCnv));//動的に確保した配列の大きさは取得できない。 | ||
+ | |||
+ | printf("%d\n", sizeof(**ptcStrMoto)); | ||
+ | printf("%d\n", sizeof(*ptcStrMoto)); | ||
+ | printf("%d\n", sizeof(ptcStrMoto)); | ||
+ | |||
+ | //動的確保変数の解放 | ||
+ | for(int i = 0;i < *pnStrArrayElement ;i++){ | ||
+ | delete[] *(ppcStrCnv + i); | ||
+ | delete[] *(ppLPSTRStrCnv + i); | ||
+ | } | ||
+ | delete[] ppcStrCnv; | ||
+ | delete[] ppLPSTRStrCnv; | ||
+ | |||
+ | //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ | ||
+ | //・_bstr_t→char | ||
+ | //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ | ||
+ | |||
+ | _tprintf(_T("\n文字列の型変換_bstr_t→char\n")); | ||
+ | |||
+ | const _bstr_t bstrtOrigin[] = {_T("_bstr_t型の変数 配列要素1"),_T("_bstr_t型の変数 配列要素2"),_T("_bstr_t型の変数 配列要素3")}; | ||
+ | |||
+ | printf("%d\n", sizeof(*bstrtOrigin)); | ||
+ | printf("%d\n", sizeof(bstrtOrigin)); | ||
+ | |||
+ | *pnStrArrayElement = sizeof(bstrtOrigin)/sizeof(*bstrtOrigin); | ||
+ | |||
+ | ppcStrCnv = new char*[*pnStrArrayElement];//要素数分の大きさ+1を確保 | ||
+ | |||
+ | //変換 | ||
+ | for(int i = 0; i < *pnStrArrayElement; i++){ | ||
+ | |||
+ | *sizeReturnValue = strlen((char*)bstrtOrigin[i]) + 1; | ||
+ | |||
+ | ppcStrCnv[i] = new char[*sizeReturnValue]; | ||
+ | |||
+ | strcpy_s(ppcStrCnv[i], *sizeReturnValue, (char*)bstrtOrigin[i]); | ||
+ | } | ||
+ | |||
+ | //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; | ||
+ | |||
+ | |||
+ | //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ | ||
+ | //・_bstr_t→TCHAR | ||
+ | //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ | ||
+ | |||
+ | _tprintf(_T("\n文字列の型変換_bstr_t→TCHAR\n")); | ||
+ | |||
+ | TCHAR **pptcStrCnv = new TCHAR*[*pnStrArrayElement];//要素数分の大きさ+1を確保 | ||
+ | |||
+ | //変換 | ||
+ | for(int i = 0; i < *pnStrArrayElement; i++){ | ||
+ | |||
+ | *sizeReturnValue = _tcslen((TCHAR*)bstrtOrigin[i]) + 1; | ||
+ | |||
+ | pptcStrCnv[i] = new TCHAR[*sizeReturnValue]; | ||
+ | |||
+ | _tcscpy_s(pptcStrCnv[i], *sizeReturnValue, (TCHAR*)bstrtOrigin[i]); | ||
+ | } | ||
+ | |||
+ | //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; | ||
+ | |||
+ | //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ | ||
+ | //・_bstr_t→CComBSTR(マルチバイト文字ワイド文字両対応 プロジェクト設定に従う) | ||
+ | //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ | ||
+ | |||
+ | _tprintf(_T("\n文字列の型変換_bstr_t→CComBSTR\n")); | ||
+ | |||
+ | CComBSTR *pccombstr_StrCnv = new CComBSTR[*pnStrArrayElement];//要素数分の大きさ+1を確保 | ||
+ | |||
+ | //変換 | ||
+ | for(int i = 0; i < *pnStrArrayElement; i++){ | ||
+ | pccombstr_StrCnv[i] = (char*)bstrtOrigin[i]; | ||
+ | } | ||
+ | |||
+ | //出力 | ||
+ | for(int i = 0; i < *pnStrArrayElement; i++){ | ||
+ | //char変換出力 | ||
+ | CW2A printstr(*(pccombstr_StrCnv + i)); | ||
+ | printf("%s\n",printstr); | ||
+ | //無変換出力 | ||
+ | _tprintf(_T("%s\n"),*(pccombstr_StrCnv + i)); | ||
+ | } | ||
+ | |||
+ | //動的確保変数の解放 | ||
+ | delete[] pccombstr_StrCnv; | ||
+ | |||
+ | //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ | ||
+ | //・_bstr_t→CStringA(マルチバイト文字) | ||
+ | //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ | ||
+ | |||
+ | _tprintf(_T("\n文字列の型変換_bstr_t→CStringA\n")); | ||
+ | |||
+ | CStringA *pcstringa_StrCnv = new CStringA[*pnStrArrayElement];//要素数分の大きさ+1を確保 | ||
+ | |||
+ | //変換 | ||
+ | for(int i = 0; i < *pnStrArrayElement; i++){ | ||
+ | pcstringa_StrCnv[i] = (char*)bstrtOrigin[i]; | ||
+ | } | ||
+ | |||
+ | //出力 | ||
+ | for(int i = 0; i < *pnStrArrayElement; i++){ | ||
+ | //char変換出力 | ||
+ | printf("%s\n",pcstringa_StrCnv[i]); | ||
+ | } | ||
+ | |||
+ | //動的確保変数の解放 | ||
+ | delete[] pcstringa_StrCnv; | ||
+ | |||
+ | //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ | ||
+ | //・_bstr_t→CStringW(ワイド文字) | ||
+ | //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ | ||
+ | |||
+ | _tprintf(_T("\n文字列の型変換_bstr_t→CStringW\n")); | ||
+ | |||
+ | CStringW *pcstringw_StrCnv = new CStringW[*pnStrArrayElement];//要素数分の大きさ+1を確保 | ||
+ | |||
+ | //変換 | ||
+ | for(int i = 0; i < *pnStrArrayElement; i++){ | ||
+ | pcstringw_StrCnv[i] = (char*)bstrtOrigin[i]; | ||
+ | } | ||
+ | |||
+ | //出力 | ||
+ | for(int i = 0; i < *pnStrArrayElement; i++){ | ||
+ | //wchar_t出力 | ||
+ | wprintf(L"%s\n",pcstringw_StrCnv[i]); | ||
+ | } | ||
+ | |||
+ | //動的確保変数の解放 | ||
+ | delete[] pcstringw_StrCnv; | ||
+ | |||
+ | //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ | ||
+ | //・_bstr_t→string(マルチバイト文字) | ||
+ | //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ | ||
+ | |||
+ | _tprintf(_T("\n文字列の型変換_bstr_t→string\n")); | ||
+ | |||
+ | string *pstring_StrCnv = new string[*pnStrArrayElement];//要素数分の大きさ+1を確保 | ||
+ | |||
+ | //変換 | ||
+ | for(int i = 0; i < *pnStrArrayElement; i++){ | ||
+ | pstring_StrCnv[i] = (char*)bstrtOrigin[i]; | ||
+ | } | ||
+ | |||
+ | //出力 | ||
+ | for(int i = 0; i < *pnStrArrayElement; i++){ | ||
+ | //char変換出力 | ||
+ | printf("%s\n",pstring_StrCnv[i].c_str()); | ||
+ | } | ||
+ | |||
+ | //動的確保変数の解放 | ||
+ | delete[] pstring_StrCnv; | ||
+ | |||
+ | |||
+ | //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ | ||
+ | //・_bstr_t→SystemString(マルチバイト文字) | ||
+ | //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ | ||
+ | |||
+ | _tprintf(_T("\n文字列の型変換_bstr_t→SystemString\n")); | ||
+ | |||
+ | array<String^> ^psysstring_StrCnv = gcnew array<String^>(*pnStrArrayElement); | ||
+ | //変換 | ||
+ | for(int i = 0; i < *pnStrArrayElement; i++){ | ||
+ | char* pcStrTemp = new char[strlen((char*)bstrtOrigin[i]) + 1]; | ||
+ | strcpy_s(pcStrTemp,strlen((char*)bstrtOrigin[i]) + 1,(char*)bstrtOrigin[i]); | ||
+ | |||
+ | System::IntPtr ptr(pcStrTemp); | ||
+ | psysstring_StrCnv[i] = Marshal::PtrToStringAnsi(ptr); | ||
+ | delete[] pcStrTemp; | ||
+ | } | ||
+ | |||
+ | //出力 | ||
+ | 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; | ||
+ | |||
+ | |||
+ | |||
+ | delete[] sizeReturnValue; | ||
+ | delete[] pnStrArrayElement; | ||
+ | </syntaxhighlight> | ||
※2014/08/30 ここまでで、疲れたから、また暫くオヤスミ。次に気が向くのはいつになるのか、誰も知らない。 | ※2014/08/30 ここまでで、疲れたから、また暫くオヤスミ。次に気が向くのはいつになるのか、誰も知らない。 | ||