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 ここまでで、疲れたから、また暫くオヤスミ。次に気が向くのはいつになるのか、誰も知らない。

2014年8月29日 (金) 00:00時点における版



個人用ツール
名前空間

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