web-dev-qa-db-fra.com

Convertir le double en chaîne C ++?

Duplicata possible:
Comment convertir un double en chaîne en C++?

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

main.cpp: Dans la fonction ‘int main ()’:
main.cpp: 40: erreur: opérandes invalides de types "const char [2]" et "double" en binaire "opérateur +"

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

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

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

27
Mentalikryst

Vous ne pouvez pas le faire directement. Il existe plusieurs façons de procéder:

  1. Utiliser un 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 existe un certain nombre d'autres façons, en utilisant diverses fonctions de conversion de double en chaîne, mais ce sont les principales façons de le faire.

72
Adam Rosenfield

En C++ 11, tilisez std::to_string si vous pouvez accepter le format par défaut (%f).

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

Utilisez 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 en doutez - de la même manière que vous imprimez à l'écran avec std::cout. Vous "imprimez" simplement une chaîne à la place. Les internes de operator << Veillent à ce qu'il y ait suffisamment d'espace et à effectuer les conversions nécessaires (par exemple, double à string).

De plus, si vous disposez de la bibliothèque Boost, vous pourriez envisager de consulter lexical_cast . La syntaxe ressemble beaucoup aux conversions de style C++ normales:

#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. Plus besoin de jouer avec atof() ou strtod() et les chaînes brutes de style C.

23
Michael Kristofik
std::string stringify(double x)
 {
   std::ostringstream o;
   if (!(o << x))
     throw BadConversion("stringify(double)");
   return o.str();
 }

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

10
aJ.

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
mp.