1. ホーム
  2. c++

[解決済み] CStringとstd::string std::wstringを相互変換するにはどうすればよいですか?

2022-03-05 19:53:39

質問

CString はかなり便利ですが std::string の方がSTLコンテナとの親和性が高い。私が使っているのは hash_map . しかし hash_map はサポートしません。 CString をキーにしたい。 CString に変換して std::string .

を書き込む CString ハッシュ関数に時間がかかるようです。

CString -----> std::string

どうすればいいのでしょうか?

std::string -----> CString:

inline CString toCString(std::string const& str)
{
    return CString(str.c_str()); 
}

そうだろうか?


EDITです。

以下、さらに質問です。

からどのように変換すればよいのでしょうか? wstring から CString その逆は?

// wstring -> CString
std::wstring src;
CString result(src.c_str());

// CString -> wstring
CString src;
std::wstring des(src.GetString());

何か問題があるのでしょうか?

さらに、どのようにすれば std::wstring から std::string その逆は?

どのように解決するのですか?

によると コードグル :

CString から std::string :

CString cs("Hello");
std::string s((LPCTSTR)cs);

BUT: std::string を常に構築することはできません。 LPCTSTR つまり、このコードはUNICODEビルドの場合は失敗します。

として std::string からしか構築できません。 LPSTR / LPCSTR VC++ 7.x 以降を使用するプログラマは、以下のような変換クラスを利用することができます。 CT2CA を仲介している。

CString cs ("Hello");
// Convert a TCHAR string to a LPCSTR
CT2CA pszConvertedAnsiString (cs);
// construct a std::string using the LPCSTR input
std::string strStd (pszConvertedAnsiString);

std::string から CString : (以下 Visual StudioのCStringに関するFAQ... )

std::string s("Hello");
CString cs(s.c_str());

CStringT は、文字列とワイド文字列の両方から構築することができます。 char* (すなわち LPSTR または wchar_t* ( LPWSTR ).

言い換えれば、char-specialization(の CStringT ) すなわち CStringA , wchar_t -特定化 CStringW および TCHAR -特殊化 CString のどちらかから構築することができます。 char またはワイド文字です。 ヌルターミネーション(ここではヌルターミネーションが非常に重要です。) 文字列のソースです。
しかし IInspectable は、quot;null-termination" の部分を修正しました。 コメントで :

NUL-terminationは必須ではありません .
CStringT は、明示的な長さの引数を取る変換コンストラクタを持っています。これはまた CStringT オブジェクトから std::string を埋め込んだオブジェクトです。 NUL 文字が含まれています。