Boost es tu amigo, si no hubiera una manera simple de hacer esto en Standard C ++ ... Por supuesto, me gusta lo que lexical_casttrae, pero siento que Boost es demasiado exagerado para este tipo de tareas ...
@TechNyquist: Tienes razón. ¡No está destinado a ser compilable, pero cambió!
neuro
1
Así que no quisiste que fuera compilable, pero en realidad con la inclusión es :)
TechNyquist
1
@TechNyquist: Sí, con algunos std::;)
neuro
16
Si no puede usarlo std::to_stringdesde C ++ 11, puede escribirlo tal como se define en cppreference.com:
std::string to_string( int value )
Convierte un entero decimal con signo en una cadena con el mismo contenido que lo std::sprintf(buf, "%d", value)que produciría para buf suficientemente grande.
Implementación
#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;}
Puedes hacer más con eso. Solo use "%g"para convertir flotante o doble a cadena, use "%x"para convertir int a representación hexadecimal, y así sucesivamente.
@DevSolar: Deberías dar más detalles. El ejemplo de impulso ya se había dado. Esta solución está disponible en la mayoría de los compiladores cuando no está instalado boost (o sus requisitos le prohíben usarlo por cualquier razón). Esto también ostreamfunciona, hasta que necesite guardar la cadena de números como algo distinto de un formato binario, octal o hexadecimal (por ejemplo, base-32).
Zac Howland el
3
No me gusta cuando las funciones no estándar como itoa()o stricmp()se dan como respuesta a algo .
DevSolar
66
Lamento ofender sus sensibilidades, pero dije que era una función no estándar en la primera oración. No lo mencioné, pero sprintftambién puedo lograr el objetivo del OP (aunque todavía sufre la falta de flexibilidad si se necesita algo más que los números de base comunes).
Zac Howland el
1
Sí, lo dijiste, y no rechacé tu respuesta, incluso cuando me molestó hacerlo. Así que creo que estamos a mano. ;-)
DevSolar
8
La siguiente macro no es tan compacta como una de un solo uso ostringstreamo boost::lexical_cast.
Pero si necesita conversión a cadena repetidamente en su código, esta macro tiene un uso más elegante que el manejo directo de secuencias de cadena o la conversión explícita cada vez.
También es muy versátil, ya que convierte todo lo que admite operator<<(), incluso en combinación.
Definición:
#include<sstream>#define SSTR( x )dynamic_cast< std::ostringstream &>( \
( std::ostringstream()<< std::dec << x )).str()
Explicación:
Esta std::deces una forma libre de efectos secundarios para convertir lo anónimo ostringstreamen genérico ostreampara operator<<()que la búsqueda de funciones funcione correctamente para todos los tipos. (De lo contrario, se mete en problemas si el primer argumento es de tipo puntero).
El dynamic_castdevuelve el tipo de nuevo para ostringstreamque pueda llamarlo str().
Utilizar:
#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: Me dices cómo convertir esto en una plantilla y actualizaré todos los proyectos de C ++ en los que he estado usando esta construcción.
DevSolar
@rubenvb: Lo siento, eso no fue tan claro como debería haber sido. No veo cómo podría convertir esto en una plantilla (usando C ++ 98) sin perder la capacidad de encadenar las salidas (como en mi segundo ejemplo), o tener que crear un desorden complicado para manejar cualquier cantidad de parámetros y tipos de parámetros.
DevSolar
@DevSolar: ¿no lo inline template<class T> std::string SSTR( T x ) { return dynamic_cast< std::ostringstream & >( (std::ostringstream() << std::dec << x) ).str() }harías? (¿No han probado, pero me pregunto lo que sería ir mal y por qué?
rubenvb
@rubenvb: Lo haría para un individuo int(mi primer ejemplo). Pero sin el ostreamvisible para el compilador en main(ya que está escondido dentro de la función de plantilla), que tratará de buscar operator<<()para const char []en mi segundo ejemplo - que estirar la pata. Sé que el OP solo solicitó un int, pero esta macro más genérica es tan útil (y en realidad bastante generalizada) que pensé en incluirla aquí.
DevSolar
Por la versatilidad, prefiero una función de plantilla. Para la cadena de margaritas tal vez eso se pueda manejar en la misma función con un poco de RTTI ...
neuro
2
Puede usar esta función para convertir inta std::stringdespués de incluir <sstream>:
to_string
likestd::string s = std::to_string(42)
Respuestas:
Puede usar std :: to_string en C ++ 11
fuente
fuente
boost::lexical_cast<std::string>(yourint)
deboost/lexical_cast.hpp
Funciona para todo con el soporte std :: ostream, pero no es tan rápido como, por ejemplo,
itoa
Incluso parece ser más rápido que stringstream o scanf:
fuente
lexical_cast
trae, pero siento que Boost es demasiado exagerado para este tipo de tareas ...Bueno, la forma más conocida de hacerlo es utilizando el operador de flujo:
Por supuesto, puede generalizarlo para cualquier tipo usando una función de plantilla ^^
fuente
#include <sstream>
.std::
;)Si no puede usarlo
std::to_string
desde C ++ 11, puede escribirlo tal como se define en cppreference.com:Implementación
Puedes hacer más con eso. Solo use
"%g"
para convertir flotante o doble a cadena, use"%x"
para convertir int a representación hexadecimal, y así sucesivamente.fuente
Función no estándar, pero se implementa en los compiladores más comunes:
Actualizar
C ++ 11 introdujo varias
std::to_string
sobrecargas (tenga en cuenta que el valor predeterminado es base-10).fuente
ostream
funciona, hasta que necesite guardar la cadena de números como algo distinto de un formato binario, octal o hexadecimal (por ejemplo, base-32).itoa()
ostricmp()
se dan como respuesta a algo .sprintf
también puedo lograr el objetivo del OP (aunque todavía sufre la falta de flexibilidad si se necesita algo más que los números de base comunes).La siguiente macro no es tan compacta como una de un solo uso
ostringstream
oboost::lexical_cast
.Pero si necesita conversión a cadena repetidamente en su código, esta macro tiene un uso más elegante que el manejo directo de secuencias de cadena o la conversión explícita cada vez.
También es muy versátil, ya que convierte todo lo que admite
operator<<()
, incluso en combinación.Definición:
Explicación:
Esta
std::dec
es una forma libre de efectos secundarios para convertir lo anónimoostringstream
en genéricoostream
paraoperator<<()
que la búsqueda de funciones funcione correctamente para todos los tipos. (De lo contrario, se mete en problemas si el primer argumento es de tipo puntero).El
dynamic_cast
devuelve el tipo de nuevo paraostringstream
que pueda llamarlostr()
.Utilizar:
fuente
inline template<class T> std::string SSTR( T x ) { return dynamic_cast< std::ostringstream & >( (std::ostringstream() << std::dec << x) ).str() }
harías? (¿No han probado, pero me pregunto lo que sería ir mal y por qué?int
(mi primer ejemplo). Pero sin elostream
visible para el compilador enmain
(ya que está escondido dentro de la función de plantilla), que tratará de buscaroperator<<()
paraconst char []
en mi segundo ejemplo - que estirar la pata. Sé que el OP solo solicitó unint
, pero esta macro más genérica es tan útil (y en realidad bastante generalizada) que pensé en incluirla aquí.Puede usar esta función para convertir
int
astd::string
después de incluir<sstream>
:fuente
Puede incluir la implementación de itoa en su proyecto.
Aquí está modificado para trabajar con std :: string: http://www.strudel.org.uk/itoa/
fuente
Aquí, hay otra manera fácil de convertir int a string
puede visitar este enlace para obtener más métodos https://www.geeksforgeeks.org/what-is-the-best-way-in-c-to-convert-a-number-to-a-string/
fuente
Supongamos que tengo
integer = 0123456789101112
. Ahora, este entero se puede convertir en una cadena por lastringstream
clase.Aquí está el código en C ++:
fuente