2011-02-03 18 views
7

Ho un codice che, nella sua forma completa più piccolo che presenta il problema (essere un buon cittadino, quando si tratta di chiedere domande), si riduce sostanzialmente verso il seguente:Perché la mia stringa non viene stampata?

#include <string> 
#include <iostream> 
int main (void) { 
    int x = 11; 
    std::string s = "Value was: " + x; 
    std::cout << "[" << s << "]" << std::endl; 
    return 0; 
} 

e mi aspetto che all'uscita

[Value was: 11] 

invece, al posto di quella, mi sto solo:

[] 

Perché? Perché non posso stampare la mia stringa? La stringa è vuota? cout è in qualche modo rotto? Sono andato pazzo ?

+0

È necessario includere "" affinché questo possa "funzionare" in modo conforme, a proposito. – GManNickG

+0

Buon punto, com'è questa compilazione? –

+0

'gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3' compila quello senza errori - forse è solo indulgente. In ogni caso, l'aggiunta di string non è d'aiuto, quindi la aggiungerò alla domanda, quindi saremo più kosher. Tuttavia, Xeo mi ha battuto così grazie :-) – paxdiablo

risposta

8

"Value was: " è di tipo const char[12]. Quando si aggiunge un intero, si fa effettivamente riferimento a un elemento di tale array. Per vedere l'effetto, modificare x in 3.

Sarà necessario creare un std::string in modo esplicito. Quindi, ancora una volta, non è possibile concatenare uno std::string e un intero. Per ovviare a questo è possibile scrivere in un std::ostringstream:

#include <sstream> 

std::ostringstream oss; 
oss << "Value was: " << x; 
std::string result = oss.str(); 
+1

In questo caso, poiché il numero è '11' e la lunghezza della stringa è 11, il puntatore risultante punta a destra sul terminatore null. – caf

+2

È del tipo 'const char [12]', in realtà . – GManNickG

+0

'char [11]' in realtà (penso). – paxdiablo

4

Non è possibile aggiungere un puntatore di caratteri e un numero intero come quello (è possibile, ma non farà ciò che si aspetta).

È necessario prima convertire la x in una stringa. È possibile farlo out-of-band via C utilizzando la funzione itoa per convertire il numero intero in una stringa:

char buf[5]; 
itoa(x, buf, 10); 

s += buf; 

O il modo STD con una sstream:

#include <sstream> 

std::ostringstream oss; 
oss << s << x; 
std::cout << oss.str(); 

O direttamente nella linea cout:

std::cout << text << x; 
+0

Non avrebbe ancora incontrato problemi perché x è di tipo int, non stringa o char *? – helloworld922

+0

Questo mi dà '[Il valore era ]' (doveva passare attraverso 'od -xcb' per vedere cosa stava succedendo lì. – paxdiablo

+0

Quando si esegue' S + = x; 'sta convertendo l'intero 11 in char 11 e ci prova per ottenere il corrispondente carattere ASCII – Naveen

2

C++ non concatena le stringhe utilizzando l'operatore +. Non esiste inoltre l'auto-promozione dai tipi di dati alla stringa.

2

In C/C++, non è possibile aggiungere un numero intero a un array di caratteri utilizzando l'operatore + perché una matrice char decade a un puntatore. Per aggiungere un int ad un string, utilizzare ostringstream:

#include <iostream> 
#include <sstream> 

int main (void) { 
    int x = 11; 
    std::ostringstream out; 
    out << "Value was: " << x; 
    std::string s = out.str(); 
    std::cout << "[" << s << "]" << std::endl; 
    return 0; 
} 
+0

Un array non è un puntatore. – GManNickG

4

divertente :) Questo è quello che paghiamo per C-compatibilità e la mancanza di un built-in string.

In ogni caso, penso che il modo più leggibile per farlo sarebbe:

std::string s = "Value was: " + boost::lexical_cast<std::string>(x); 

Poiché il tipo di ritorno è lexical_caststd::string qui, verrà selezionato il diritto di sovraccarico di +.

Problemi correlati