C 文字列操作 新しいページはコチラ

提供: yonewiki
移動: 案内, 検索
(文字列の型変換)
(文字列の型変換)
2,182行: 2,182行:
 
delete[] psysstring_StrCnv;
 
delete[] psysstring_StrCnv;
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
<syntaxhighlight lang="cpp" line start="1">
 +
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
//・string→char
 +
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
 +
_tprintf(_T("\n文字列の型変換string→char\n"));
 +
 +
const string stringOrigin[] = {"string型の変数 配列要素1","string型の変数 配列要素2","string型の変数 配列要素3"};
 +
 +
printf("%d\n", sizeof(*stringOrigin));
 +
printf("%d\n", sizeof(stringOrigin));
 +
 +
*pnStrArrayElement = sizeof(stringOrigin)/sizeof(*stringOrigin);
 +
 +
ppcStrCnv = new char*[*pnStrArrayElement];//要素数分の大きさ+1を確保
 +
 +
//変換
 +
for(int i = 0; i < *pnStrArrayElement; i++){
 +
*sizeReturnValue = strlen(stringOrigin[i].c_str()) + 1;
 +
ppcStrCnv[i] = new char[*sizeReturnValue];
 +
strcpy_s(ppcStrCnv[i], *sizeReturnValue, stringOrigin[i].c_str());
 +
}
 +
 +
//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;
 +
 +
 +
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
//・string→TCHAR
 +
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
 +
_tprintf(_T("\n文字列の型変換string→TCHAR\n"));
 +
 +
pptcStrCnv = new TCHAR*[*pnStrArrayElement];//要素数分の大きさ+1を確保
 +
 +
//変換
 +
for(int i = 0; i < *pnStrArrayElement; i++){
 +
 +
#ifdef UNICODE
 +
mbstowcs_s(sizeReturnValue, NULL, 0,stringOrigin[i].c_str(), 0);
 +
pptcStrCnv[i] = new TCHAR[*sizeReturnValue];
 +
mbstowcs_s(sizeReturnValue, pptcStrCnv[i], *sizeReturnValue,stringOrigin[i].c_str(), *sizeReturnValue);
 +
#else
 +
*sizeReturnValue = strlen(stringOrigin[i].c_str()) + 1;
 +
pptcStrCnv[i] = new TCHAR[*sizeReturnValue];
 +
_tcscpy_s(pptcStrCnv[i], *sizeReturnValue, stringOrigin[i].c_str());
 +
#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;
 +
 +
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
//・string→_bstr_t(マルチバイト文字)
 +
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
 +
_tprintf(_T("\n文字列の型変換string→_bstr_t\n"));
 +
 +
pbstrt_StrCnv = new _bstr_t[*pnStrArrayElement];//要素数分の大きさ+1を確保
 +
 +
//変換
 +
for(int i = 0; i < *pnStrArrayElement; i++){
 +
pbstrt_StrCnv[i] = stringOrigin[i].c_str();
 +
}
 +
 +
//出力
 +
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;
 +
 +
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
//・string→CComBSTR(マルチバイト文字ワイド文字両対応 プロジェクト設定に従う)
 +
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
 +
_tprintf(_T("\n文字列の型変換string→CComBSTR\n"));
 +
 +
pccombstr_StrCnv = new CComBSTR[*pnStrArrayElement];//要素数分の大きさ+1を確保
 +
 +
//変換
 +
for(int i = 0; i < *pnStrArrayElement; i++){
 +
pccombstr_StrCnv[i] = stringOrigin[i].c_str();
 +
}
 +
 +
//出力
 +
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;
 +
 +
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
//・string→CStringA(マルチバイト文字)
 +
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
 +
_tprintf(_T("\n文字列の型変換string→CStringA\n"));
 +
 +
pcstringa_StrCnv = new CStringA[*pnStrArrayElement];//要素数分の大きさ+1を確保
 +
 +
//変換
 +
for(int i = 0; i < *pnStrArrayElement; i++){
 +
pcstringa_StrCnv[i] = stringOrigin[i].c_str();
 +
}
 +
 +
//出力
 +
for(int i = 0; i < *pnStrArrayElement; i++){
 +
//char変換出力
 +
printf("%s\n",pcstringa_StrCnv[i]);
 +
}
 +
 +
//動的確保変数の解放
 +
delete[] pcstringa_StrCnv;
 +
 +
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
//・string→CStringW(ワイド文字)
 +
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
 +
_tprintf(_T("\n文字列の型変換string→CStringW\n"));
 +
 +
pcstringw_StrCnv = new CStringW[*pnStrArrayElement];//要素数分の大きさ+1を確保
 +
 +
//変換
 +
for(int i = 0; i < *pnStrArrayElement; i++){
 +
pcstringw_StrCnv[i] = stringOrigin[i].c_str();
 +
}
 +
 +
//出力
 +
for(int i = 0; i < *pnStrArrayElement; i++){
 +
//wchar_t出力
 +
wprintf(L"%s\n",pcstringw_StrCnv[i]);
 +
}
 +
 +
//動的確保変数の解放
 +
delete[] pcstringw_StrCnv;
 +
 +
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
//・string→SystemString(マルチバイト文字)
 +
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
 +
_tprintf(_T("\n文字列の型変換string→SystemString\n"));
 +
 +
psysstring_StrCnv = gcnew array<String^>(*pnStrArrayElement);
 +
//変換
 +
for(int i = 0; i < *pnStrArrayElement; i++){
 +
char* pcStrTemp = new char[strlen(stringOrigin[i].c_str()) + 1];
 +
strcpy_s(pcStrTemp,strlen(stringOrigin[i].c_str()) + 1,stringOrigin[i].c_str());
 +
System::IntPtr ptr(pcStrTemp);
 +
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>
 +
<syntaxhighlight lang="cpp" line start="1">
 +
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
//・SystemString→char
 +
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
 +
_tprintf(_T("\n文字列の型変換string→char\n"));
 +
 +
array<String^> ^sysstringOrigin = gcnew array<String^>{"SystemString型の変数 配列要素1","SystemString型の変数 配列要素2","SystemString型の変数 配列要素3"};
 +
 +
printf("%d\n", sysstringOrigin->Length);
 +
 +
*pnStrArrayElement = sysstringOrigin->Length;
 +
 +
ppcStrCnv = new char*[*pnStrArrayElement];//要素数分の大きさ+1を確保
 +
 +
//変換
 +
for(int i = 0; i < *pnStrArrayElement; i++){
 +
pin_ptr<const wchar_t> wch = PtrToStringChars(sysstringOrigin[i]);
 +
wcstombs_s(sizeReturnValue, NULL, 0,wch, 0);
 +
ppcStrCnv[i] = new char[*sizeReturnValue];
 +
wcstombs_s(sizeReturnValue, ppcStrCnv[i], *sizeReturnValue, wch, *sizeReturnValue);
 +
}
 +
 +
//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;
 +
 +
 +
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
//・SystemString→TCHAR
 +
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
 +
_tprintf(_T("\n文字列の型変換SystemString→TCHAR\n"));
 +
 +
pptcStrCnv = new TCHAR*[*pnStrArrayElement];//要素数分の大きさ+1を確保
 +
 +
//変換
 +
for(int i = 0; i < *pnStrArrayElement; i++){
 +
 +
#ifdef UNICODE
 +
pin_ptr<const wchar_t> wch = PtrToStringChars(sysstringOrigin[i]);
 +
*sizeReturnValue = _tcslen(wch) + 1;
 +
pptcStrCnv[i] = new TCHAR[*sizeReturnValue];
 +
_tcscpy_s(pptcStrCnv[i], *sizeReturnValue, wch);
 +
#else
 +
pin_ptr<const wchar_t> wch = PtrToStringChars(sysstringOrigin[i]);
 +
wcstombs_s(sizeReturnValue, NULL, 0,wch, 0);
 +
pptcStrCnv[i] = new TCHAR[*sizeReturnValue];
 +
wcstombs_s(sizeReturnValue, pptcStrCnv[i], *sizeReturnValue, wch, *sizeReturnValue);
 +
#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;
 +
 +
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
//・SystemString→_bstr_t(マルチバイト文字)
 +
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
 +
_tprintf(_T("\n文字列の型変換SystemString→_bstr_t\n"));
 +
 +
pbstrt_StrCnv = new _bstr_t[*pnStrArrayElement];//要素数分の大きさ+1を確保
 +
 +
//変換
 +
for(int i = 0; i < *pnStrArrayElement; i++){
 +
pin_ptr<const wchar_t> wch = PtrToStringChars(sysstringOrigin[i]);
 +
wcstombs_s(sizeReturnValue, NULL, 0,wch, 0);
 +
char* pcStrTemp = new char[*sizeReturnValue];
 +
wcstombs_s(sizeReturnValue, pcStrTemp, *sizeReturnValue, wch, *sizeReturnValue);
 +
pbstrt_StrCnv[i] = pcStrTemp;
 +
}
 +
 +
//出力
 +
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;
 +
 +
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
//・SystemString→CComBSTR(マルチバイト文字ワイド文字両対応 プロジェクト設定に従う)
 +
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
 +
_tprintf(_T("\n文字列の型変換SystemString→CComBSTR\n"));
 +
 +
pccombstr_StrCnv = new CComBSTR[*pnStrArrayElement];//要素数分の大きさ+1を確保
 +
 +
//変換
 +
for(int i = 0; i < *pnStrArrayElement; i++){
 +
pin_ptr<const wchar_t> wch = PtrToStringChars(sysstringOrigin[i]);
 +
wcstombs_s(sizeReturnValue, NULL, 0,wch, 0);
 +
char* pcStrTemp = new char[*sizeReturnValue];
 +
wcstombs_s(sizeReturnValue, pcStrTemp, *sizeReturnValue, wch, *sizeReturnValue);
 +
pccombstr_StrCnv[i] = pcStrTemp;
 +
}
 +
 +
//出力
 +
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;
 +
 +
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
//・SystemString→CStringA(マルチバイト文字)
 +
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
 +
_tprintf(_T("\n文字列の型変換SystemString→CStringA\n"));
 +
 +
pcstringa_StrCnv = new CStringA[*pnStrArrayElement];//要素数分の大きさ+1を確保
 +
 +
//変換
 +
for(int i = 0; i < *pnStrArrayElement; i++){
 +
pin_ptr<const wchar_t> wch = PtrToStringChars(sysstringOrigin[i]);
 +
wcstombs_s(sizeReturnValue, NULL, 0,wch, 0);
 +
char* pcStrTemp = new char[*sizeReturnValue];
 +
wcstombs_s(sizeReturnValue, pcStrTemp, *sizeReturnValue, wch, *sizeReturnValue);
 +
pcstringa_StrCnv[i] = pcStrTemp;
 +
}
 +
 +
//出力
 +
for(int i = 0; i < *pnStrArrayElement; i++){
 +
//char変換出力
 +
printf("%s\n",pcstringa_StrCnv[i]);
 +
}
 +
 +
//動的確保変数の解放
 +
delete[] pcstringa_StrCnv;
 +
 +
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
//・SystemString→CStringW(ワイド文字)
 +
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
 +
_tprintf(_T("\n文字列の型変換SystemString→CStringW\n"));
 +
 +
pcstringw_StrCnv = new CStringW[*pnStrArrayElement];//要素数分の大きさ+1を確保
 +
 +
//変換
 +
for(int i = 0; i < *pnStrArrayElement; i++){
 +
pin_ptr<const wchar_t> wch = PtrToStringChars(sysstringOrigin[i]);
 +
wcstombs_s(sizeReturnValue, NULL, 0,wch, 0);
 +
char* pcStrTemp = new char[*sizeReturnValue];
 +
wcstombs_s(sizeReturnValue, pcStrTemp, *sizeReturnValue, wch, *sizeReturnValue);
 +
pcstringw_StrCnv[i] = pcStrTemp;
 +
}
 +
 +
//出力
 +
for(int i = 0; i < *pnStrArrayElement; i++){
 +
//wchar_t出力
 +
wprintf(L"%s\n",pcstringw_StrCnv[i]);
 +
}
 +
 +
//動的確保変数の解放
 +
delete[] pcstringw_StrCnv;
 +
 +
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
//・SystemString→string(マルチバイト文字)
 +
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 +
 +
_tprintf(_T("\n文字列の型変換SystemString→string\n"));
 +
 +
pstring_StrCnv = new string[*pnStrArrayElement];//要素数分の大きさ+1を確保
 +
 +
//変換
 +
for(int i = 0; i < *pnStrArrayElement; i++){
 +
pin_ptr<const wchar_t> wch = PtrToStringChars(sysstringOrigin[i]);
 +
wcstombs_s(sizeReturnValue, NULL, 0,wch, 0);
 +
char* pcStrTemp = new char[*sizeReturnValue];
 +
wcstombs_s(sizeReturnValue, pcStrTemp, *sizeReturnValue, wch, *sizeReturnValue);
 +
pstring_StrCnv[i] = pcStrTemp;
 +
}
 +
 +
//出力
 +
for(int i = 0; i < *pnStrArrayElement; i++){
 +
//char変換出力
 +
printf("%s\n",pstring_StrCnv[i].c_str());
 +
}
 +
 +
//動的確保変数の解放
 +
delete[] pstring_StrCnv;
 +
</syntaxhighlight>
 +
 +
と、こんな感じです。
 +
 
※2014/09/21 ここまでで、疲れたから、また暫くオヤスミ。次に気が向くのはいつになるのか、誰も知らない。
 
※2014/09/21 ここまでで、疲れたから、また暫くオヤスミ。次に気が向くのはいつになるのか、誰も知らない。
  

2014年9月22日 (月) 00:00時点における版



個人用ツール
名前空間

変種
操作
案内
ツールボックス