Win32プロジェクトやMFCプロジェクトでは文字列型としてCStringが使用されます。
C++標準のstd::stringやC言語のchar*を使用することもできますが、画面との紐づきやAPI関数のインタフェースを考えるとCStringを使用するほうが使い勝手が良いためです。
この記事では、CStringと他の文字列型、数値型との相互変換方法について紹介します。
CStringとCStringWとCStringA
CStringはプロジェクトのプロパティ(文字セット)に応じて内部的にはCStringWまたはCStringAが使用されます。
文字セット | CStringの型 | 内部で使用される型 |
---|---|---|
Unicode文字セットを使用する | CStringW | WCHAR (wchar_t) |
マルチバイト文字セットを使用する | CStringA | char |
CStringWの場合char*やstd::string(内部的にchar)との変換でひと手間が必要になるため、CStringがCStringWなのかCStringAなのかを意識しておく必要があります。
CStringと他の文字列型、数値型との相互変換
CStringからstd::stringへの変換
CStringからstd::stringへの変換を行う場合は、CStringのGetBuffer関数で取得した生データを代入します。
但し、std::stringは内部的にはcharで扱われているためCStringW(Unicode文字セットを使用する)の場合には一度CStringAに変換してからGetBuffer関数を実施します。
// 文字列(変換元)
CString src = _T("hoge");
// 文字列(変換先)
std::string dst = "";
// 変換(CStringWの場合)
dst = CStringA(src).GetBuffer();
// 変換(CStringAの場合)
dst = src.GetBuffer();
std::stringからCStringへの変換
std::stringからCStringへの変換を行う場合は、std::stringのc_str関数で取得した生データを代入します。
CStringWへの代入にはchar*も対応しているため考慮する必要はないです。
// 文字列(変換元)
std::string src = "hoge";
// 文字列(変換先)
CString dst = (LPCTSTR)nullptr;
// 変換
dst = src.c_str();
CStringからchar*への変換
CStringからchar*への変換を行う場合は、CStringのGetBuffer関数で取得した生データをstrcpy_s関数でコピーします。
std::stringへの変換と同様、CStringW(Unicode文字セットを使用する)の場合には一度CStringAに変換してからGetBuffer関数を実施します。
// 文字列(変換元)
CString src = _T("hoge");
// 文字列(変換先)
char dst[5] = { 0 };
// 変換(CStringWの場合)
::strcpy_s(dst, CStringA(src).GetBuffer());
// 変換(CStringAの場合)
::strcpy_s(dst, src.GetBuffer());
char*からCStringへの変換
char*からCStringへの変換を行う場合は、char*の変数をそのまま代入します。
std::stringへの変換と同様、CStringWへの代入にはchar*も対応しているため考慮する必要はないです。
// 文字列(変換元)
char src[5] = "hoge";
// 文字列(変換先)
CString dst = (LPCTSTR)nullptr;
// 変換
dst = src;
CStringから数値型への変換
CStringから整数型への変換を行う場合は、_ttoi関数、_ttol関数、_ttoll関数、_ttof関数を使用します。
// 文字列(変換元)
CString src = _T("100");
// 整数(変換先、int)
int dstI = 0;
// 整数(変換先、long)
long dstL = 0;
// 整数(変換先、long long)
long long dstLL = 0;
// 実数(変換先、double)
double dstD = 0.0;
// 変換(int)
dstI = ::_ttoi(src);
// 変換(long)
dstL = ::_ttol(src);
// 変換(long long)
dstLL = ::_ttoll(src);
// 変換(double)
dstD = ::_ttof(src);
数値型からCStringへの変換
数値型からCStringへの変換を行う場合は、CStringのFormat関数を使用して変換を行います。
Format関数はprintfと同じようにフォーマット指定を行うことで対象の変数に文字列を設定します。(他の文字列型からの変換もFormat関数を使用して行うことができます)
// 整数(変換元、int)
int srcI = 100;
// 整数(変換元、long)
long srcL = 100;
// 整数(変換元、long long)
long long srcLL = 100;
// 実数(変換元、double)
double srcD = 100.0;
// 文字列(変換先)
CString dst = (LPCTSTR)nullptr;
// 変換(int)
dst.Format(_T("%d"), srcI);
// 変換(long)
dst.Format(_T("%ld"), srcL);
// 変換(long long)
dst.Format(_T("%lld"), srcLL);
// 変換(double)
dst.Format(_T("%lf"), srcD);
終わりに
CStringと他の文字列型、数値型との相互変換方法について紹介しました。
他の言語のようにサクッと変換というわけにはいかないですが、Win32やMFCで文字列を扱う場合には避けられないので覚えておいたほうが良いと思います。
この記事について誤っている点・不明な点などありましたらコメントまでお願いします。
コメント