Convertir un int a std :: string


143

¿Cuál es el camino más corto, preferiblemente en línea, para convertir un int en una cadena? Las respuestas usando stl y boost serán bienvenidas.



63
En C ++ 11 puede usar to_stringlikestd::string s = std::to_string(42)

55
¡Viva C ++ 11 y to_string! :)
agosto

Respuestas:


351

Puede usar std :: to_string en C ++ 11

int i = 3;
std::string str = std::to_string(i);

44
std :: to_string () no funciona en MinGW, si a alguien le importa.
Archie

3
@bparker Correcto, se ha solucionado en gcc 4.8.0, supongo. MinGW viene con el último Code :: Blocks (13.12) todavía tiene gcc 4.7.1.
Archie

47
#include <sstream>
#include <string>
const int i = 3;
std::ostringstream s;
s << i;
const std::string i_as_string(s.str());

36

boost::lexical_cast<std::string>(yourint) de boost/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:


15
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 ...
rubenvb


Debe considerar a su audiencia si no pueden usar Boost
Damian

55
"Las respuestas usando stl y boost serán bienvenidas". - Audiencia considerada
Conrad Jones

30

Bueno, la forma más conocida de hacerlo es utilizando el operador de flujo:

#include <sstream>

std::ostringstream s;
int i;

s << i;

std::string converted(s.str());

Por supuesto, puede generalizarlo para cualquier tipo usando una función de plantilla ^^

#include <sstream>

template<typename T>
std::string toString(const T& value)
{
    std::ostringstream oss;
    oss << value;
    return oss.str();
}

1
Nota: esto requiere #include <sstream>.
TechNyquist

@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 = new char[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.


14

Función no estándar, pero se implementa en los compiladores más comunes:

int input = MY_VALUE;
char buffer[100] = {0};
int number_base = 10;
std::string output = itoa(input, buffer, number_base);

Actualizar

C ++ 11 introdujo varias std::to_stringsobrecargas (tenga en cuenta que el valor predeterminado es base-10).


3
@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 );
    return 0;
}

1
@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>:

#include <sstream>

string IntToString (int a)
{
    stringstream temp;
    temp<<a;
    return temp.str();
}



-3

Supongamos que tengo integer = 0123456789101112. Ahora, este entero se puede convertir en una cadena por la stringstreamclase.

Aquí está el código 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;

    }

¿No eran similares, pero ya se dieron respuestas más completas hace muchos años?
Walter

Sí, pero creo que esta respuesta es perfecta, ya que no obtuve ninguna respuesta efectiva de la anterior.
Shawon
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.