Boost est votre ami, s'il n'y avait pas de moyen simple de faire cela en C ++ standard ... j'aime bien sûr ce qui lexical_castapporte, mais je pense que Boost est assez exagéré pour ce genre de tâches ...
@TechNyquist: Vous avez raison. Pas censé être compilable, mais changé!
neuro
1
Donc, vous ne vouliez pas que ce soit compilable, mais en fait avec l'inclusion, c'est :)
TechNyquist
1
@TechNyquist: Oui, avec certains std::;)
neuro
16
Si vous ne pouvez pas utiliser à std::to_stringpartir 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 avec le même contenu que ce std::sprintf(buf, "%d", value)qui produirait un buf suffisamment grand.
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 =newchar[length +1];
snprintf( buf, length +1,"%d", x );
std::string str( buf );delete[] buf;return str;}
Vous pouvez en faire plus. Utilisez simplement "%g"pour convertir float ou double en chaîne, utilisez "%x"pour convertir int en représentation hexadécimale, et ainsi de suite.
@DevSolar: Vous devriez élaborer. L'exemple du boost avait déjà été donné. Cette solution est disponible sur la plupart des compilateurs lorsque boost n'est pas installé (ou que vos exigences vous interdisent de l'utiliser pour quelque raison que ce soit). Cela ostreamfonctionne aussi bien, jusqu'à ce que vous ayez besoin de sauvegarder la chaîne de nombres sous un format autre qu'un format binaire, octal ou hexadécimal (par exemple base-32).
Zac Howland
3
Je n'aime pas quand des fonctions non standard aiment itoa()ou stricmp()sont données comme réponse à quoi que ce soit .
DevSolar
6
Désolé d'offenser votre sensibilité, mais j'ai déclaré que c'était une fonction non standard dans la première phrase. Je ne l'ai pas mentionné, mais je sprintfpeux également atteindre l'objectif de l'OP (bien que souffre toujours du manque de flexibilité si autre chose que les numéros de base communs est nécessaire).
Zac Howland
1
Oui, vous l'avez dit, et je n'ai pas voté contre votre réponse, même si cela me démangeait de le faire. Alors je pense que nous sommes égaux. ;-)
DevSolar
8
La macro suivante n'est pas aussi compacte qu'un ostringstreamou un boost::lexical_cast.
Mais si vous avez besoin d'une conversion en chaîne à plusieurs reprises dans votre code, cette macro est plus élégante à utiliser que la gestion directe des flux de chaînes ou du cast explicite à chaque fois.
Il est également très polyvalent, car il convertit tout ce qui est pris en charge operator<<(), même en combinaison.
Définition:
#include<sstream>#define SSTR( x )dynamic_cast< std::ostringstream &>( \
( std::ostringstream()<< std::dec << x )).str()
Explication:
Il std::decs'agit d'un moyen sans effet secondaire de transformer l'anonymat ostringstreamen un générique ostreamafin que la operator<<()recherche de fonction fonctionne correctement pour tous les types. (Vous avez des problèmes sinon si le premier argument est un type pointeur.)
Le dynamic_castrenvoie le type à pour ostringstreamque vous puissiez l'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 );return0;}
@rubenvb: Vous me dites comment transformer cela en modèle et je mettrai à jour tous les projets C ++ dans lesquels j'utilise cette construction.
DevSolar
@rubenvb: Désolé, ce n'était pas aussi clair qu'il aurait dû l'être. Je ne vois pas comment je pourrais transformer cela en un modèle (en utilisant C ++ 98) sans perdre la capacité de chaîner les sorties (comme dans mon deuxième exemple), ou avoir à créer un désordre compliqué à gérer n'importe quel nombre de paramètres et types de paramètres.
DevSolar
@DevSolar: ne ferait pas inline template<class T> std::string SSTR( T x ) { return dynamic_cast< std::ostringstream & >( (std::ostringstream() << std::dec << x) ).str() }? (Je n'ai pas testé, mais je me demande ce qui ne va pas et pourquoi?
rubenvb
@rubenvb: Cela ferait l'affaire pour un individu int(mon premier exemple). Mais sans le ostreamvisible au compilateur main(comme il est caché dans la fonction de modèle), il va essayer de chercher operator<<()pour const char []mon deuxième exemple - qui croasser. Je sais que l'OP n'a demandé qu'un int, mais cette macro plus générique est si utile (et en fait assez répandue) que j'ai pensé l'inclure ici.
DevSolar
Pour la polyvalence, je préfère une fonction de modèle. Pour la guirlande peut-être qui peut être manipulée dans la même fonction avec un peu de RTTI ...
neuro
2
Vous pouvez utiliser cette fonction pour convertir intaprès std::stringavoir inclus <sstream>:
to_string
commestd::string s = std::to_string(42)
Réponses:
Vous pouvez utiliser std :: to_string en C ++ 11
la source
la source
boost::lexical_cast<std::string>(yourint)
deboost/lexical_cast.hpp
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:
la source
lexical_cast
apporte, mais je pense que Boost est assez exagéré pour ce genre de tâches ...Eh bien, le moyen bien connu de le faire consiste à utiliser l'opérateur de flux:
Bien sûr, vous pouvez le généraliser pour tout type en utilisant une fonction de modèle ^^
la source
#include <sstream>
.std::
;)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:la mise en oeuvre
Vous pouvez en faire plus. Utilisez simplement
"%g"
pour convertir float ou double en chaîne, utilisez"%x"
pour convertir int en représentation hexadécimale, et ainsi de suite.la source
Fonction non standard, mais implémentée sur les compilateurs les plus courants:
Mettre à jour
C ++ 11 a introduit plusieurs
std::to_string
surcharges (notez qu'il est par défaut base-10).la source
ostream
fonctionne aussi bien, jusqu'à ce que vous ayez besoin de sauvegarder la chaîne de nombres sous un format autre qu'un format binaire, octal ou hexadécimal (par exemple base-32).itoa()
oustricmp()
sont données comme réponse à quoi que ce soit .sprintf
peux également atteindre l'objectif de l'OP (bien que souffre toujours du manque de flexibilité si autre chose que les numéros de base communs est nécessaire).La macro suivante n'est pas aussi compacte qu'un
ostringstream
ou unboost::lexical_cast
.Mais si vous avez besoin d'une conversion en chaîne à plusieurs reprises dans votre code, cette macro est plus élégante à utiliser que la gestion directe des flux de chaînes ou du cast explicite à chaque fois.
Il est également très polyvalent, car il convertit tout ce qui est pris en charge
operator<<()
, même en combinaison.Définition:
Explication:
Il
std::dec
s'agit d'un moyen sans effet secondaire de transformer l'anonymatostringstream
en un génériqueostream
afin que laoperator<<()
recherche de fonction fonctionne correctement pour tous les types. (Vous avez des problèmes sinon si le premier argument est un type pointeur.)Le
dynamic_cast
renvoie le type à pourostringstream
que vous puissiez l'appelerstr()
.Utilisation:
la source
inline template<class T> std::string SSTR( T x ) { return dynamic_cast< std::ostringstream & >( (std::ostringstream() << std::dec << x) ).str() }
? (Je n'ai pas testé, mais je me demande ce qui ne va pas et pourquoi?int
(mon premier exemple). Mais sans leostream
visible au compilateurmain
(comme il est caché dans la fonction de modèle), il va essayer de chercheroperator<<()
pourconst char []
mon deuxième exemple - qui croasser. Je sais que l'OP n'a demandé qu'unint
, mais cette macro plus générique est si utile (et en fait assez répandue) que j'ai pensé l'inclure ici.Vous pouvez utiliser cette fonction pour convertir
int
aprèsstd::string
avoir inclus<sstream>
:la source
Vous pouvez inclure la mise en œuvre d'itoa dans votre projet.
Voici itoa modifié pour fonctionner avec std :: string: http://www.strudel.org.uk/itoa/
la source
Voici un autre moyen simple de convertir un int en chaîne
vous pouvez visiter ce lien pour plus de méthodes https://www.geeksforgeeks.org/what-is-the-best-way-in-c-to-convert-a-number-to-a-string/
la source
Supposons que je l'ai
integer = 0123456789101112
. Désormais, cet entier peut être converti en chaîne par lastringstream
classe.Voici le code en C ++:
la source