Quel est le moyen le plus court, de préférence inline, de convertir un int en chaîne? Les réponses utilisant stl et boost seront les bienvenues.
Vous pouvez utiliser std :: to_string en C++ 11
int i = 3;
std::string str = std::to_string(i);
#include <sstream>
#include <string>
const int i = 3;
std::ostringstream s;
s << i;
const std::string i_as_string(s.str());
boost::lexical_cast<std::string>(yourint)
from boost/lexical_cast.hpp
Le travail fonctionne pour tout avec le support std :: ostream, mais n'est pas aussi rapide que, par exemple, itoa
Il semble même être plus rapide que stringstream ou scanf:
Eh bien, le moyen le plus connu consiste à utiliser l'opérateur de flux:
#include <sstream>
std::ostringstream s;
int i;
s << i;
std::string converted(s.str());
Bien sûr, vous pouvez le généraliser pour tout type en utilisant une fonction template ^^
#include <sstream>
template<typename T>
std::string toString(const T& value)
{
std::ostringstream oss;
oss << value;
return oss.str();
}
Fonction non standard, mais implémentée sur les compilateurs les plus courants:
_int input = MY_VALUE;
char buffer[100] = {0};
int number_base = 10;
std::string output = itoa(input, buffer, number_base);
_
Mettre à jour
C++ 11 a introduit plusieurs std::to_string
surcharges (notez qu'il utilise par défaut la base-10).
Si vous ne pouvez pas utiliser std::to_string
à partir de C++ 11, vous pouvez l'écrire tel qu'il est défini sur cppreference.com:
std::string to_string( int value )
Convertit un entier décimal signé en une chaîne de contenu identique à ce questd::sprintf(buf, "%d", value)
produirait pour un buf de taille suffisante.
La mise en oeuvre
_#include <cstdio>
#include <string>
#include <cassert>
std::string to_string( int x ) {
int length = snprintf( NULL, 0, "%d", x );
assert( length >= 0 );
char* buf = new char[length + 1];
snprintf( buf, length + 1, "%d", x );
std::string str( buf );
delete[] buf;
return str;
}
_
Vous pouvez faire plus avec ça. Utilisez simplement _"%g"
_ pour convertir les valeurs float ou double en chaîne, utilisez _"%x"
_ pour convertir int en représentation hexadécimale, etc.
La macro suivante n'est pas tout à fait aussi compacte que ostringstream
ou boost::lexical_cast
à usage unique.
Mais si vous avez besoin de convertir à plusieurs reprises chaîne-chaîne dans votre code, cette macro est plus élégante à utiliser que de gérer directement des chaînes de chaînes ou une diffusion explicite à chaque fois.
Il est également très polyvalent, car il convertit tout supporté par operator<<()
, même en combinaison.
Définition:
#include <sstream>
#define SSTR( x ) dynamic_cast< std::ostringstream & >( \
( std::ostringstream() << std::dec << x ) ).str()
Explication:
Le std::dec
est un moyen sans effets secondaires de transformer la ostringstream
anonyme en une fonction générique ostream
so operator<<()
fonctionne correctement pour tous les types. (Vous aurez des problèmes si le premier argument est un type de pointeur.)
Le dynamic_cast
renvoie le type à ostringstream
pour que vous puissiez appeler str()
.
Utilisation:
#include <string>
int main()
{
int i = 42;
std::string s1 = SSTR( i );
int x = 23;
std::string s2 = SSTR( "i: " << i << ", x: " << x );
return 0;
}
Vous pouvez inclure la mise en œuvre d’itoa dans votre projet.
Voici la version modifiée pour fonctionner avec std :: string: http://www.strudel.org.uk/itoa/
Vous pouvez utiliser cette fonction pour convertir int
en std::string
après avoir inclus <sstream>
:
#include <sstream>
string IntToString (int a)
{
stringstream temp;
temp<<a;
return temp.str();
}