2

コードは argv[1] を .txt および _r.txt と連結することになっています。

std::stringstream sstm;
std::stringstream sstm_r;

sstm<<argv[1]<<".txt";
sstm_r<<argv[1]<<"_r.txt";

const char* result = sstm.str().c_str();
const char* result_r = sstm_r.str().c_str();

fs.open(result);
fs_r.open(result_r);

cout<<result<<endl;
cout<<result_r<<endl;

しかし、それが行うことは、「abc」を argv[1] として入力すると、結果が「abc_r.tx0」になり、result_r も同じ「abc_r.tx0」になります。これを行う正しい方法とその理由は何ですか?これは間違っています。

4

2 に答える 2

8

によって返されるポインターが関連付けられているstd::stringインスタンスはc_str()破棄され、ダングリング ポインターとして残り、未定義の動作が発生しますresult。使用する場合は、インスタンスresult_rを保存する必要があります:std::stringc_str()

const std::string result(sstm.str());

fs.open(result.c_str());  /* If this is an fstream from C++11 you
                             can pass a 'std::string' instead of a
                             'const char*'. */
于 2012-09-12T13:12:11.580 に答える
3

次のように文字列を操作します。

{
  const std::string& tmp = stringstream.str();
  const char* cstr = tmp.c_str();
}

これは、別の取引所から取得したものです

于 2012-09-12T13:14:10.643 に答える