Convertir double en chaîne C++? [dupliquer]

possibilité de dupliquer:

comment convertir un double en chaîne en C++?

je veux combiner une chaîne et un double et g++ lance cette erreur:

principal.cpp: en fonction " int main ()":

principal.cpp: 40: erreur: opérandes invalides des types 'const char [2]' et 'double' à 'opérateur binaire+' 151990920"

Voici la ligne de code sur laquelle il lance l'erreur:

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

storedCorrect [] est un tableau de chaînes de caractères, et c1 et c2 sont deux doubles. Y a-t-il un moyen de convertir c1 et c2 en chaînes pour permettre à mon programme de compiler correctement?

27
demandé sur Community 2009-07-14 06:44:59

5 réponses

Vous ne pouvez pas le faire directement. Il y a plusieurs façons de le faire:

  1. utiliser a std::stringstream :

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

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

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

il y a un nombre d'autres façons, en utilisant diverses fonctions de conversion double-à-chaîne, mais ce sont les principales façons dont vous le verrez fait.

71
répondu Adam Rosenfield 2013-06-07 14:47:22

En C++11, utiliser std::to_string si vous pouvez accepter la valeur par défaut ( "format 151920920" ).

storedCorrect[count]= "(" + std::to_string(c1) + ", " + std::to_string(c2) + ")";
26
répondu kennytm 2011-12-09 10:09:41

Utilisation std::stringstream . Son operator << est surchargé pour tous les types intégrés.

#include <sstream>    

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

Cela fonctionne comme vous vous attendez de la même façon que vous imprimez à l'écran avec std::cout . Vous "imprimez" simplement une chaîne de caractères à la place. Les internes de operator << prennent soin de s'assurer qu'il y a assez d'espace et de faire toutes les conversions nécessaires (par exemple, double à string ).

Aussi, si vous avez la bibliothèque Boost disponible, vous pourriez envisager d'examiner lexical_cast . La syntaxe ressemble beaucoup aux moulages normaux de style C++:

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

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

sous le capot, boost::lexical_cast fait essentiellement la même chose que nous avons fait avec std::stringstream . Un avantage clé de l'utilisation de la bibliothèque Boost est que vous pouvez aller dans l'autre sens (par exemple, string à double ) tout aussi facilement. Ne plus jouer avec atof() ou strtod() et crus c-style chaîne.

22
répondu Michael Kristofik 2013-09-06 12:45:02
std::string stringify(double x)
 {
   std::ostringstream o;
   if (!(o << x))
     throw BadConversion("stringify(double)");
   return o.str();
 }

C++ FAQ: http://www.parashift.com/c++ - faq-lite/misc-technical-issues.html#faq-39.1

9
répondu aJ. 2009-07-14 02:50:44

je crois que le sprintf est la bonne fonction pour vous. Je suis dans la bibliothèque standard, comme printf. Suivez le lien ci-dessous pour plus d'informations:

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

1
répondu mp. 2009-07-14 02:52:47