2009-07-14 23 views
27

Possible Duplicate:
How do I convert a double into a string in C++?Converti doppio in stringa C++?

voglio combinare una corda e un ++ doppio e g sta gettando questo errore:

main.cpp: In funzione 'int main()':
main.cpp: 40: errore: operandi non validi di 'char const [2]' tipi e 'doppi' a 'operatore +' binario

Ecco la linea di codice che si sta gettando l'errore:

 
storedCorrect[count] = "("+c1+","+c2+")"; 

storedCorrect [] è un array di stringhe e c1 e c2 sono entrambi doppi. C'è un modo per convertire c1 e c2 in stringhe per consentire al mio programma di compilare correttamente?

+11

Quali sono gli esempi riportati di seguito: http://www.codeproject.com/KB/recipes/Tokenizer.aspx Sono molto efficienti e alquanto eleganti. –

+0

http://stackoverflow.com/q/29200635/395461 – Shannon

risposta

22

Usa std::stringstream. Il suo operator << è sovraccarico per tutti i tipi integrati.

#include <sstream>  

std::stringstream s; 
s << "(" << c1 << "," << c2 << ")"; 
storedCorrect[count] = s.str(); 

Questo funziona come ci si aspetterebbe - allo stesso modo di stampare la schermata con std::cout. Invece stai semplicemente "stampando" su una stringa. Gli interni di operator << si occupano di assicurarsi che ci sia spazio sufficiente e di effettuare tutte le conversioni necessarie (ad esempio, double a string).

Inoltre, se si dispone della libreria Boost disponibile, è possibile considerare la ricerca su lexical_cast. La sintassi sembra molto simile alla normale C++ - stile getta:

#include <string> 
#include <boost/lexical_cast.hpp> 
using namespace boost; 

storedCorrect[count] = "(" + lexical_cast<std::string>(c1) + 
         "," + lexical_cast<std::string>(c2) + ")"; 

Sotto il cofano, boost::lexical_cast è fondamentalmente facendo la stessa cosa che abbiamo fatto con std::stringstream. Un vantaggio chiave nell'utilizzo della libreria Boost è che puoi passare dall'altra parte (ad esempio, string a double) con la stessa facilità. Niente più problemi con atof() o strtod() e stringhe in stile C non elaborate.

+0

In realtà, 'boost :: lexical_cast' non usa' std :: stringstream' sotto il cofano. Implementa le proprie routine di conversione che sono significativamente più veloci rispetto all'utilizzo di 'stringstream' e nella maggior parte dei casi sono più veloci di' scanf'/'printf'. Vedi: http://www.boost.org/doc/libs/1_48_0/doc/html/boost_lexical_cast/performance.html – Ferruccio

+0

L'origine di 'lexical_cast' sembra molto diversa dall'ultima volta che l'ho vista. Sembra che abbiano migliorato notevolmente le prestazioni negli ultimi due rilasci di Boost. Questa è una ragione in più per andare avanti se puoi. –

71

Non è possibile farlo direttamente. Ci sono un certo numero di modi per farlo:

  1. Utilizzare un std::stringstream:

    std::ostringstream s; 
    s << "(" << c1 << ", " << c2 << ")"; 
    storedCorrect[count] = s.str() 
    
  2. Uso boost::lexical_cast:

    storedCorrect[count] = "(" + boost::lexical_cast<std::string>(c1) + ", " + boost::lexical_cast<std::string>(c2) + ")"; 
    
  3. Uso std::snprintf:

    char buffer[256]; // make sure this is big enough!!! 
    snprintf(buffer, sizeof(buffer), "(%g, %g)", c1, c2); 
    storedCorrect[count] = buffer; 
    

Ci sono molti altri modi, usando varie funzioni di conversione da doppia a stringa, ma questi sono i principali modi in cui lo vedrete fare.

+4

So che questa risposta è vecchia, ma potresti anche voler includere 'std :: string to_string (double);' qui. – JohnJohn

1

Credo che lo sprint sia la funzione giusta per te. Sono nella libreria standard, come printf.Segui il link qui sotto per maggiori informazioni:

http://www.cplusplus.com/reference/clibrary/cstdio/sprintf/

+8

'sprintf' non è sicuro per la formattazione numerica, perché non esegue alcun controllo dei limiti sul buffer di output e non esiste un buon metodo portatile per determinare la dimensione del buffer che sarebbe sicuro per qualsiasi valore' double'. –

+0

Bene, in questo caso, usare 'snprintf' :) Ma in effetti, prevedere la dimensione del buffer necessaria può essere difficile. – tomsmeding

26

In C++ 11, use std::to_string se è possibile accettare il formato predefinito (%f).

storedCorrect[count]= "(" + std::to_string(c1) + ", " + std::to_string(c2) + ")";