2012-06-22 24 views
6

std :: ostringstreamを使用して数字を文字列(char *)に変換しようとしていますが、動作していないようです。ここに私が持っているコードは次のとおりです。std :: ostringstreamが有効な文字列を返さない

#include <windows.h> 
#include <sstream> 

int main() 
{ 
    std::ostringstream out; 
    out << 1234; 

    const char *intString = out.str().c_str(); 

    MessageBox(NULL, intString, intString, MB_OK|MB_ICONEXCLAMATION); 

    return 0; 
} 

結果のメッセージボックスには、単にテキストがありません。

これは、out.str().c_str()への呼び出しが無効な文字列を返すと考えていますが、わかりません。これまでにこのプログラムを修正して以来、まだ問題を抱えているので、私は恥ずかしいほど単純な間違いをしたに違いありません。ヘルプは高く評価されています!

+0

+1。私はGCC 4.7.1でWindows 7で適切なテキストを取得します。 – chris

+4

@chris:未定義の動作は未定義です。 ; - ] – ildjarn

+0

@ildjarn、ああ、いいキャッチ。 – chris

答えて

12

out.str()あなたは一時的に.c_str()を呼び出していることを意味し、値によってstd::stringを返します。その結果、intStringが初期化されると、既に無効な(破棄された)データを指しています。

キャッシュそれと.str()の結果と作品:SSCCEを含んで明確、簡潔な質問の

std::string const& str = out.str(); 
char const* intString = str.c_str(); 
+2

'const&'はとても魅力的です。なぜ単に 'const std :: string mystring(out.str());'? – rubenvb

+1

@rubenvb:違いは何だと思いますか? – ildjarn

+0

こんにちは。私は@rubenvbは次のことを意味すると思います:開発者が 'const std :: string str(out.str());を読むと' str'がコピーであることを直ちに理解します。しかし 'const std :: string&str = out.str();'は 'str'が他の変数が扱う' string'への参照であるという印象を与えます。 2番目のケースは混乱するかもしれませんね。 – olibre

関連する問題