web-dev-qa-db-ja.com

Cスタイルの文字列をC ++ std :: stringに変換する

Cスタイルの文字列をC++ std::stringに変換する最良の方法は何ですか?過去にstringstreamsを使用して実行しました。もっと良い方法はありますか?

32
blcArmadillo

C++文字列には、Cスタイル文字列からstd::stringを直接構築できるコンストラクタがあります。

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

または、代わりに:

std::string myCppString = "This is a C string!";

@TrevorHickeyがコメントで述べているように、std::stringを初期化するポインターがNULLポインターではないことを確認するよう注意してください。その場合、上記のコードは未定義の動作につながります。繰り返しますが、nullポインターがある場合は、文字列さえまったくないと主張できます。 :-)

51
templatetypedef

文字列クラスのさまざまなコンストラクターを確認します。 documentation 興味があるかもしれません:

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

そして:

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

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++14std::string_literals名前空間の演算子を使用します

using namespace std::string_literals;

auto s3 = "abc\0\0def"s;    // is a std::string
5
Shreevardhan

char*からstd::string、コンストラクタを使用できます。

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

または、string sはすでに存在します。単にこれを書いてください:

s=std::string(a);
4
Manas

C文字列から直接std::stringを初期化できます:

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

一般に(新しいストレージを宣言せずに)1引数のコンストラクタを使用してc-stringを文字列右辺値に変更できます。

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

ただし、これは、関数への参照によって渡す文字列を構築するときに機能しません(私がちょうど遭遇した問題)、例えば.

void ProcessString(std::string& username);
ProcessString(std::string("this is a test"));   // fails

参照をconst参照にする必要があります。

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