1803 votes

Manière la plus facile de convertir en int en string en C++

Quelle est la façon la plus facile de convertir int équivalent de la chaîne en C++. Je suis conscient des deux méthodes. Est-il un moyen plus facile?

1.

int a = 10;
char *intStr = itoa(a);
string str = string(intStr);

2.

int a = 10;
stringstream ss;
ss << a;
string str = ss.str();

2393voto

Matthieu M. Points 101624

C++0x introduit std::stoi (et ses variantes pour chaque type numérique) et std::to_string, les homologues de la C atoi et itoa mais exprimée en terme de std::string.

std::string s = std::to_string(42);

est donc le chemin le plus court je pense.

Note: voir [string.les conversions] (21.5 dans n3242)

199voto

DevSolar Points 18897

Depuis "la conversion ... à la chaîne" est un problème récurrent, j'ai toujours définir le SSTR() macro dans une centrale en-tête de mes sources C++:

#include <sstream>

#define SSTR( x ) dynamic_cast< std::ostringstream & >( \
        ( std::ostringstream() << std::dec << x ) ).str()

L'utilisation est aussi facile que pourrait être:

int x = 42;
cout << SSTR( "i is: " << x );
string s = SSTR( i );
puts( SSTR( i ).c_str() );

112voto

Rasoul Points 650

J'ai l'habitude d'utiliser la méthode suivante:

#include <sstream>

template <typename T>
  string NumberToString ( T Number )
  {
     ostringstream ss;
     ss << Number;
     return ss.str();
  }

décrit en détail ici.

91voto

Jerry Coffin Points 237758

Probablement le plus commun de moyen facile enveloppements essentiellement de votre deuxième choix dans un modèle nommé lexical_cast, comme celui de Boost, de sorte que votre code ressemble à ceci:

int a = 10;
string s = lexical_cast<string>(a);

Un concept est qu'il prend en charge d'autres distributions (par exemple, dans la direction opposée fonctionne tout aussi bien).

Notez également que, bien que Boost lexical_cast a commencé comme simple fait d'écrire à un stringstream, puis l'extraire de retour de courant, il y a maintenant un couple d'ajouts. Tout d'abord, les spécialisations pour un certain nombre de types ont été ajoutés, de sorte que pour de nombreux types, c'est beaucoup plus rapide que d'utiliser un stringstream. Deuxièmement, il vérifie le résultat, donc (par exemple) si la conversion à partir d'une chaîne en int, il peut lancer une exception si la chaîne contient quelque chose qui n'a pas pu être convertie en int (par exemple, 1234 serait un succès, mais 123abc jeter).

Edit (car c'est un peu vieux):

Que de C++11, il y a un std::to_string fonction surchargée pour les types d'entiers, de sorte que vous pouvez utiliser un code comme:

int a = 20;
std::string s = to_string(a);

La norme définit comme étant l'équivalent de faire la conversion avec sprintf (en utilisant le spécificateur de conversion qui correspond à l'fournie type d'objet, comme %d pour int), dans un tampon de taille suffisante, puis en créant une std::string du contenu de la mémoire tampon.

41voto

Kevin Points 1252

Si vous avez Boost installé (qui doit):

#include <boost/lexical_cast.hpp>

int num = 4;
std::string str = boost::lexical_cast<std::string>(num);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X