0

私はベクトルを持っています:

vector<stringstream*> ssv;
for (int i = 0; i < cIter; i++) {
    ssv.push_back(new std::stringstream);
}

ベクトルssv文字列の要素を入れるにはどうすればよいですか?

私は試します:

string s1 = "easfef" + '\n';
int i = 0;
*ssv[i] << s1 << '\n';

しかし、それは私に空の文字列を与えます:

string sdf = ssv[i]->str();

どうすればいいですか?

「\ n」を手伝ってくれてありがとう、しかしそれはまだベクトルの問題です:私が書いた場合:

std::string s1 = "qwerqwr\n";   // for example
int i = 0;
*ssv[i] << s1;

しかし、以前のように空の文字列をください

string sdf = ssv[i]->str();
4

3 に答える 3

3

あなたの主な問題は、文字列を初期化する方法です:

"easfef" + '\n'

はaに"easfef"減衰し、値が 10の an に昇格されます (ASCII を想定)。次に、2 つが加算され、文字列リテラルを超えた場所を指すポインターが生成されます。あなたのお母さんが恐竜に食べられて、墜落する可能性は非常に高いです。const char *'\n'int

これを修正する簡単な方法は、強制することですstd::string:

std::string s1 = std::string("easfef") + '\n';

簡単な方法は、改行をインライン化することです。

std::string s1 = "easfef\n";
于 2013-01-12T09:19:39.740 に答える
2

あなたのコードで

string s1 = "easfef" + '\n';

初期化式は、実際には次のように計算されます。

"easfef" + 10;

これは、文字列の 11 番目の文字へのポインターです。

しかし、そのようなものはないので、未定義の動作があります。


修理:

string s1 = string() + "easfef" + '\n';

とは言っstringstreamても、解決しようとしている問題が何であれ、ポインタのベクトルはほぼ確実に非現実的な解決策です。

より高いレベルの問題を説明してみてください。

于 2013-01-12T09:20:16.277 に答える
0

C++ では、文字列リテラルはcharsの生の配列であり、配列はポインターとして扱うことができ、'\n' などの文字リテラルは数値として扱うことができるため"easfef" + '\n'、ポインター算術演算として解釈されます。

あなたは書くべきです:

string s1 = "easfef";
s1 += '\n';
于 2013-01-12T09:22:08.020 に答える