web-dev-qa-db-fra.com

Conversion d'un int en std :: string

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.

121
Amir Rachum

Vous pouvez utiliser std :: to_string en C++ 11

int i = 3;
std::string str = std::to_string(i);
320
Yochai Timmer
#include <sstream>
#include <string>
const int i = 3;
std::ostringstream s;
s << i;
const std::string i_as_string(s.str());
46
Benoit

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:

36
ltjax

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();
}
30
neuro

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

14
Zac Howland

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 que std::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.

14
user2622016

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;
}
8
DevSolar

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/

0
ArtemGr

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();
}
0
dodo