Convertir un int a std :: string

Respuestas:

351

Puede usar std :: to_string en C ++ 11

int i = 3;
std::string str = std::to_string(i);
Yochai Timmer
fuente
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());
Benoit
fuente
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:

ltjax
fuente
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
2
¿Exceso? ¿Basado en que? boost.org/doc/libs/1_53_0/doc/html/boost_lexical_cast/…
Catskul
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();
}
neuro
fuente
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.

usuario2622016
fuente
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).

Zac Howland
fuente
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;
}
DevSolar
fuente
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();
}
vejestorio
fuente
-2
#include <string>
#include <stdlib.h>

Aquí, hay otra manera fácil de convertir int a string

int n = random(65,90);
std::string str1=(__String::createWithFormat("%c",n)->getCString());

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/

Vipul Dungranee
fuente
debe incluir lo siguiente para usar este método: archivos de encabezado #include <string> #include <stdlib.h>
Vipul Dungranee
-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;

    }
Shawon
fuente
¿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