2011-01-21 15 views
23

Cスタイルの文字列をC++ std::stringに変換する最適な方法は何ですか?過去に私はstringstreamを使ってそれをしました。より良い方法がありますか?あなたは、C-文字列から直接std::stringを初期化することができますCスタイルの文字列をC++のstd :: stringに変換する

char* myStr = "This is a C string!"; 
std::string myCppString = myStr; 
+0

cstringとは? MFCから 'CString'を意味しますか?または、ヌルで終了するchar配列(C文字列)?または、他の何か? –

答えて

41

C++文字列を使用すると、Cスタイルの文字列を変換することができますコンストラクタを持っています文字列クラス:documentation あなたが興味があるのは:

//string(char* s) 
std::string str(cstring); 

そして:

//string(char* s, size_t n) 
std::string str(cstring, len_str); 
+0

そして今私は 'delete myStr;' noをしなければなりません? –

+0

@BarnabasSzabolcsいいえ、それは必要ではありません。新しいもので割り当てられたメモリだけを削除する必要があります。文字列リテラルへのポインタを解放する必要はありません。 – templatetypedef

+0

私は正しいと思うので、文字列はこのchar *の内部コピーを作成します。 –

3

std::string s = "i am a c string"; 
std::string t = std::string("i am one too"); 
5

は別のコンストラクタを確認

4

あなたはstd::stringchar*を意味する場合は、コンストラクタを使用することができます。

char* a; 
std::string s(a); 

それともstring sがすでに存在する場合、単純にこの書き込み:あなただけに、C-文字列を変更するには1、引数のコンストラクタを使用することができます(新しいストレージを宣言せずに)一般的に

s=std::string(a); 
+1

いいえあなたの例では、std :: stringのコンストラクタに論理エラーがスローされます。 'a'はNULLにすることはできません。 –

1

を文字列の右辺値は:(問題は、私はちょうどに走った)、例えば機能を参照することによって、それを渡すために文字列を構築するとき

string xyz = std::string("this is a test") + 
      std::string(" for the next 60 seconds ") + 
      std::string("of the emergency broadcast system."); 

しかし、これは動作しません。

あなたが参照にconst参照にする必要があり
void ProcessString(std::string& username); 
ProcessString(std::string("this is a test")); // fails 

void ProcessString(const std::string& username); 
ProcessString(std::string("this is a test")); // works. 
3

C++11

std::string operator ""_s(const char * str, std::size_t len) { 
    return std::string(str, len); 
} 

auto s1 = "abc\0\0def";  // C style string 
auto s2 = "abc\0\0def"_s; // C++ style std::string 

C++14文字列リテラル演算子をオーバーロードする:std::string_literals名前空間から演算子を使用します

using namespace std::string_literals; 

auto s3 = "abc\0\0def"s; // is a std::string 
関連する問題