ページ 11

変換方法について

Posted: 2009年11月04日(水) 11:10
by イネ
CString型からstd::string型に変換するにはどうしたらよいでしょうか?
調べてみたところ、LPCTSTRにキャストする方法がありましたが、試してみたところ、vs2008ではコンパイルが通りませんでした。
よろしくお願い致します。

CString cStr;
std::string str((LPCTSTR)str);

Re:変換方法について

Posted: 2009年11月04日(水) 11:12
by イネ
すみません、プログラム2行目の変数名を間違えていました。
こちらが正しいです。

CString cStr;
std::string str((LPCTSTR)cStr); // CStringからstd::stringへ変換

Re:変換方法について

Posted: 2009年11月04日(水) 11:23
by バグ
CStringとは、MFCのCStringクラスでしょうか?
もしそうであれば、GetBufferというメンバ関数を利用すればいいですよ。

Re:変換方法について

Posted: 2009年11月04日(水) 12:02
by たかぎ
CStringがMFCのものだとすると、Unicode版でコンパイルしていませんか?
Unicodeの場合、LPCTSTRはconst wchar_t*になるので、単純にはいきません。
もし、ASCIIの範囲しか使ってないのであれば...
CString cStr; 
std::string str((LPCTSTR)str, (LPCTSTR)str + str.Length());
とでもすればどうにかなると思います。

Re:変換方法について

Posted: 2009年11月04日(水) 12:32
by softya
マルチバイト専用のCStringならCStringAがありますが代用可能でしょうか?
つまり、今CStringのところをCStringAに置き換えるって事ですが。この場合は、TEXT("")とか_T("")とか書いている部分を全部はずす必要が出てくるので面倒ですが、CStringとCStringAを使い分けできるのが便利です。
ただ、コンパイラの文字セットをマルチバイト文字に切り替えるほうがはるかに簡単ですけどね。

Re:変換方法について

Posted: 2009年11月04日(水) 20:57
by イネ
バグさん
>MFCのCStringクラスです。
たかぎさん、softyaさん
>Unicode版でコンパイルしていました。(VisualStudioのオプションをデフォルトのまま使用してましたので)
>おっしゃるとおり、_T();マクロをプログラム内で多用してましたので、文字セットを変えることで対応しました。


結果的には
文字セットをマルチバイト文字に切り替え、
CString cStr = "";
std::string str(cStr.GetBuffer());

で解決しました。
お答えくださった皆様、ありがとうございました。
文字コードの辺り、まだまだ理解が足りないなと痛感しました。