危険性
スレッドセーフでない為、
マルチスレッドで文字列を扱う場合、可能な限り
STLのstring型かwstring型を使う方がよい。
ローカル変数の場合などは問題はないが、classやtypedef内の変数に宣言すると、上記危険性が増加する。
よって、CStringには文字コードの互換性等の便利な機能が存在するので、共通データや常に存在するデータなどに用いるのではなく、それらの機能を活かす為に、一時的に使用するのが適切である。
ユニコード文字列とマルチバイト文字列の互換性
共通 |
ユニコード |
マルチバイト |
CString(WCHAR* or CHAR*) |
CStringW(WCHAR*) |
CStringA(CHAR*) |
例)
CStringA mbStr = "マルチバイト";
CStringW wStr = L"ユニコード";
mbStr += wStr; // マルチバイト文字列に変換
wStr += mbStr; // ユニコード文字列に変換
文字列⇒数値
例)10進数の場合
CString str = _T("123");
int nDec = 0;
::StrToIntEx(str, STIF_DEFAULT, &nDec);
数値⇒文字列
CString::Format()を使用する。
例)
int num = 101;
CString str = _T("");
str.Format("%d", i);
ASSERT(str == "101");
CStringにおける文字列領域(ポインタ)へのアクセス方法
LPTSTRとCStringの間などで、データのやり取りする場合に必要になる。同じ型同士なら、簡単なのですが...
読み取りのみの場合
例)
LPTSTR pszText = NULL;
CString str = _T("おはよう");
pszText = const_cast<LPTSTR>(static_cast<LPCTSTR>(str));
本来、読み取り用を無理やり書き込み可能にしてるので、書き込みには使わないこと!
書き込みの場合
例)
CString str = _T("おはよう");
LPTSTR pszText = str.GetBuffer(256);
_tcscpy_s(pszText, 256, _T("こんばんわ"));
TRACE(_T("str.GetLength() = %d\n"), str.GetLength());
str.ReleaseBuffer( );
TRACE(_T("str.GetLength() = %d\n"), str.GetLength());
ReleaseBuffer()は忘れないこと!
実行結果)
str.GetLength() = 4
str.GetLength() = 5
_T()
_T() を利用したほうが、無難。
コメント
最終更新:2010年11月08日 19:35