2012-06-22 13 views
6

Próbuję użyć std :: ostringstream, aby przekonwertować liczbę na ciąg znaków (char *), ale wydaje się, że nie działa. Oto kod, który mam:std :: ostringstream nie zwraca poprawnego ciągu znaków

#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; 
} 

W wynikowym oknie komunikatu po prostu nie ma tekstu.

To prowadzi mnie do przekonania, że ​​wywołanie out.str().c_str() zwraca nieprawidłowy ciąg, ale nie jestem pewien. Skoro zmniejszyłem ten program do tej pory, wciąż mam problem, musiałem popełnić żenująco prosty błąd. Pomoc jest doceniana!

+0

+1 za jasny, zwięzły pytanie, które zawiera SSCCE. Dostaję prawidłowy tekst w Windows 7 z GCC 4.7.1. – chris

+4

@chris: Niezdefiniowane zachowanie jest niezdefiniowane. ; -] – ildjarn

+0

@ildjarn, Ah, dobry połów. – chris

Odpowiedz

12

out.str() zwraca std::stringwartością, co oznacza, że ​​dzwonisz .c_str() czasowego. W związku z tym do czasu zainicjowania intString wskazuje już na nieprawidłowe (zniszczone) dane.

Cache wynikiem .str() i praca z tym:

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

"Const &" wygląda na potężnego awkarda. Dlaczego nie po prostu 'const std :: string mystring (out.str());'? – rubenvb

+1

@rubenvb: Co postrzegasz jako różnicę? – ildjarn

+0

Cześć ildjarn. Chyba @rubenvb oznacza: Kiedy programista czyta 'const std :: string str (out.str());' od razu rozumie, że 'str' jest kopią. Ale 'const std :: string & str = out.str();' daje wrażenie 'str' jest po prostu odniesieniem do' ciągu' obsługiwanego przez inną zmienną. Drugi przypadek może być mylący, prawda? – olibre

Powiązane problemy