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?
5 réponses
Vous ne pouvez pas le faire directement. Il y a plusieurs façons de le faire:
-
utiliser a
std::stringstream
:std::ostringstream s; s << "(" << c1 << ", " << c2 << ")"; storedCorrect[count] = s.str()
-
utilisation
boost::lexical_cast
:storedCorrect[count] = "(" + boost::lexical_cast<std::string>(c1) + ", " + boost::lexical_cast<std::string>(c2) + ")";
-
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.
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) + ")";
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.
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
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 /