2012-04-18 1 views
28

Sto provando a fare qualcosa di molto semplice e tuttavia, dopo un'ora di ricerca non riesco a trovare una risposta adatta, quindi mi manca qualcosa di abbastanza ovvio.C++ crea stringa di testo e variabili

Sto provando a creare dinamicamente nomi di file da utilizzare con ifstream. Mentre capisco che sono disponibili vari metodi per fare ciò, ho deciso di creare una std :: string, e di usare stringname.c_str per convertire in const.

Il problema è comunque che ho bisogno di creare la stringa con un mix di variabili e valori di testo predefiniti. Ricevo errori del compilatore, quindi questo deve essere un problema di sintassi.

Pseudo

std::string var = "sometext" + somevar + "sometext" + somevar; 

Grazie!

+4

se si tratta di una sintassi err oppure dovresti pubblicare il codice effettivo, quindi possiamo dire che vuoi che l'errore di sintassi sia (e perché è sbagliato) e imparerai di più che se ti diamo solo la sintassi corretta. – twain249

+0

'std :: string var = std :: string (" sometext ") + somevar +" sometext "+ somevar;' –

risposta

44

Hai mai considerato l'utilizzo di stringhe?

#include <string> 
#include <sstream> 

std::ostringstream oss; 
oss << "sometext" << somevar << "sometext" << somevar; 
std::string var = oss.str(); 
+0

Esattamente + std :: ostringstream sarebbe sufficiente. – doc

+0

Grazie @eli - Questo era il metodo che inizialmente avevo tentato senza fortuna, ma ora funziona! Puoi spiegare cosa sta facendo ss.str()? –

+0

'ss.str()' sta estraendo il contenuto di 'stringstream'. –

2

È inoltre possibile utilizzare sprintf:

char str[1024]; 
sprintf(str, "somtext %s sometext %s", somevar, somevar); 
+2

Questo non è molto sicuro però. L'ulteriore complessità di renderlo sicuro probabilmente non lo rende una scelta molto buona. –

+0

'snprintf()' sarebbe una scelta migliore. 'snprintf (str, 1024," somtext% s sometext% s ", somevar, somevar);' – doc

+2

Questo non è sicuro, ma * troppo * utile in confronto con ingombranti std :: string e ostringstream. – Yury

16
std::string var = "sometext" + somevar + "sometext" + somevar; 

Questo non funziona perché le aggiunte vengono eseguite da sinistra a destra e "sometext" (il primo) è solo un const char *. Non ha operator+ da chiamare. La correzione più semplice è questa:

std::string var = std::string("sometext") + somevar + "sometext" + somevar; 

Ora, il primo parametro della lista da sinistra a destra di + operazioni è un std::string, che ha un operator+(const char *). Quell'operatore produce una stringa, che fa funzionare il resto della catena.

si può anche fare tutte le operazioni siano in var, che è un std::string e quindi ha tutti gli operatori necessari:

var = "sometext"; 
var += somevar; 
var += "sometext"; 
var += somevar; 
+1

... supponendo che * tipo * di 'somevar' sia nella lista' operator + (* tipo *) '. – doc

+0

@doc Sì Altrimenti, dovrai aggiungere del codice attorno a "somevar" per farlo funzionare.Ad esempio, se è un 'int', puoi usare Boost :: lexical_cast per renderlo una stringa. (O, in quel caso, la soluzione 'stringstream' potrebbe essere migliore.) –

2

Vedi anche boost::format:

#include <boost/format.hpp> 

std::string var = (boost::format("somtext %s sometext %s") % somevar % somevar).str(); 
10

In C++ 11 è possibile utilizzare std::to_string:

std::string var = "sometext" + std::to_string(somevar) + "sometext" + std::to_string(somevar);