2012-06-22 16 views
6

Sto provando a utilizzare std :: ostringstream per convertire un numero in una stringa (char *), ma non sembra funzionare. Ecco il codice che ho:std :: ostringstream non restituisce una stringa valida

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

La finestra di messaggio risultante semplicemente non contiene testo.

Questo mi porta a credere che la chiamata a out.str().c_str() stia restituendo una stringa non valida, ma non sono sicuro. Dal momento che ho ridotto questo programma fino ad ora e sto ancora riscontrando il problema, devo aver commesso un errore imbarazzante. L'aiuto è apprezzato!

+0

+1 per la chiara, concisa questione che include uno SSCCE. Tuttavia, ottengo il testo corretto in Windows 7 con GCC 4.7.1. – chris

+4

@chris: il comportamento non definito non è definito. ; -] – ildjarn

+0

@ildjarn, Ah, buona cattura. – chris

risposta

12

out.str() restituisce un std::stringper valore, il che significa che si sta chiamando .c_str() a titolo temporaneo. Di conseguenza, quando viene inizializzato intString, sta già puntando a dati non validi (distrutti).

cache il risultato di .str() e lavorare con quella:

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

Il 'const &' sembra potente awkard. Perché non solo 'const std :: string mystring (out.str());'? – rubenvb

+1

@rubenvb: cosa percepisci come la differenza? – ildjarn

+0

Ciao ildjarn. Immagino che @rubenvb significhi: quando uno sviluppatore legge 'const std :: string str (out.str());' capisce immediatamente che 'str' è una copia. Ma 'const std :: string & str = out.str();' dà all'impressione 'str' è solo un riferimento a una' stringa' gestita da un'altra variabile. Il secondo caso potrebbe essere confuso, non è vero? – olibre

Problemi correlati