を使用して、でstd::string
取得しfgets()
たデータを保存する必要があります。これを行うには、char*
戻り値をfgets()
にstd::string
配列に格納することを。これはどのように行うことができますか?
を使用して、でstd::string
取得しfgets()
たデータを保存する必要があります。これを行うには、char*
戻り値をfgets()
にstd::string
配列に格納することを。これはどのように行うことができますか?
回答:
std::string
これのコンストラクタがあります:
const char *s = "Hello, World!";
std::string str(s);
この構造の深いコピー文字リストのことを注意s
し、s
すべきではないnullptr
、または他の動作は未定義です。
str
は単なる変数名です。それは何もすることができますS
、abc
、l
、I
、strHelloWorld
。明らかに、いくつかの選択肢は他のものよりも優れています。しかし、この例でstr
はかなり受け入れられます。
char *のサイズがわかっている場合は、代わりにこれを使用してください
char* data = ...;
int size = ...;
std::string myString(data, size);
これはstrlenを使用しません。
編集:文字列変数がすでに存在する場合は、assign()を使用します。
std::string myString;
char* data = ...;
int size = ...;
myString.assign(data, size);
コンストラクターに渡します。
const char* dat = "my string!";
std::string my_string( dat );
関数string.c_str()を使用して、他の方法を実行できます。
std::string my_string("testing!");
const char* dat = my_string.c_str();
c_str()
リターンconst char*
const char* charPointer = "Hello, World!\n";
std::string strFromChar;
strFromChar.append(charPointer);
std::cout<<strFromChar<<std::endl;
ユーザー定義のリテラルを使用する新しいメソッドについて述べたい s
。これは新しいものではありませんが、C ++ 14標準ライブラリに追加されたため、より一般的になります。
一般的なケースでは大幅に不要です:
string mystring = "your string here"s;
しかし、ワイド文字列でもautoを使用できます。
auto mystring = U"your UTF-32 string here"s;
そして、ここが本当に素晴らしいところです:
string suffix;
cin >> suffix;
string mystring = "mystring"s + suffix;
私はMSVC2005と格闘しているstd::string(char*)
だけで、一流の回答と同じようにコンストラクタを使用しています。このバリアントが常に信頼されているhttp://en.cppreference.com/w/cpp/string/basic_string/basic_stringで#4としてリストされているのを見て、古いコンパイラでもこれを提供していると思います。
このコンストラクターが(unsigned char*)
引数としてとのマッチングを絶対に拒否していることに気づくのに長い時間がかかりました!std::string
引数の型と一致しないというこれらの不可解なエラーメッセージが表示されました。これは、私が意図していたものではありません。ちょうどstd::string((char*)ucharPtr)
私の問題を解決して議論を投げかけるだけ...まあ!
char* data;
std::string myString(data);
data
初期化されていない(空の)ままになります。
エリック以外の誰もこれについて言及しなかった理由はわかりませんが、このページによると、代入演算子は問題なく機能します。コンストラクタ、.assign()、. append()を使用する必要はありません。
std::string mystring;
mystring = "This is a test!"; // Assign C string to std:string directly
std::cout << mystring << '\n';
=
(および+=
)。これはこのようなリテラルでは発生しないようですが、char*
物事だけで発生します。このようなレポートが実際にリークであるかどうかの問題については、ここで説明します。しかしdestString = std::string(srcCharPtr);
、valgrind への割り当てを変更した場合、リークレポートは消えました。YMMV。
Constructs an object of class basic_string and determines its initial string value from the array
。それは値を示し、バッファやポインタの所有権については何も述べていません。