Quel est le moyen le plus court, de préférence en ligne, pour convertir un int en chaîne? Les réponses utilisant stl et boost seront les bienvenues.
to_string
commestd::string s = std::to_string(42)
Quel est le moyen le plus court, de préférence en ligne, pour convertir un int en chaîne? Les réponses utilisant stl et boost seront les bienvenues.
to_string
commestd::string s = std::to_string(42)
Réponses:
Vous pouvez utiliser std :: to_string en C ++ 11
int i = 3;
std::string str = std::to_string(i);
boost::lexical_cast<std::string>(yourint)
de boost/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:
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:
#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 de modèle ^^
#include <sstream>
template<typename T>
std::string toString(const T& value)
{
std::ostringstream oss;
oss << value;
return oss.str();
}
#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:
std::string to_string( int value )
Convertit un entier décimal signé en une chaîne avec le même contenu que cestd::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 = new char[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.
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 est par défaut base-10).
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()
ou stricmp()
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 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::dec
s'agit d'un moyen sans effet secondaire de transformer l'anonymat ostringstream
en un générique ostream
afin 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_cast
renvoie le type à pour ostringstream
que 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 );
return 0;
}
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 le ostream
visible 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.
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/
#include <string>
#include <stdlib.h>
Voici un autre moyen simple de convertir un int en chaîne
int n = random(65,90);
std::string str1=(__String::createWithFormat("%c",n)->getCString());
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/
Supposons que je l'ai integer = 0123456789101112
. Désormais, cet entier peut être converti en chaîne par la stringstream
classe.
Voici le code en C ++:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,i;
string s;
stringstream st;
for(i=0;i<=12;i++)
{
st<<i;
}
s=st.str();
cout<<s<<endl;
return 0;
}