numeros entero dev convertir caracteres cadena c++ string int type-conversion

entero - La forma más fácil de convertir int a string en C++



int to string c++ (25)

Aquí hay otra manera fácil de hacer

char str[100] ; sprintf(str , "%d" , 101 ) ; string s = str;

sprintf es bien conocido para insertar datos en una cadena de formato requerido.

Puede convertir la matriz char * en una cadena como se muestra en la tercera línea.

¿Cuál es la forma más fácil de convertir de int a string equivalente en C ++? Soy consciente de dos métodos. ¿Hay alguna forma más fácil?

(1)

int a = 10; char *intStr = itoa(a); string str = string(intStr);

(2)

int a = 10; stringstream ss; ss << a; string str = ss.str();


¿No sería más fácil usar stringstreams?

#include <sstream> int x=42; //The integer string str; //The string ostringstream temp; //temp as in temporary temp<<x; str=temp.str(); //str is temp as string

O hacer una función:

#include <sstream> string IntToString (int a) { ostringstream temp; temp<<a; return temp.str(); }


C ++ 11 introduce std::stoi (y variantes para cada tipo numérico) y std::to_string , las contrapartes de C atoi e itoa pero expresadas en términos de std::string .

#include <string> std::string s = std::to_string(42);

Por lo tanto, es el camino más corto que se me ocurre. Incluso puede omitir el nombre del tipo, usando la palabra clave auto :

auto s = std::to_string(42);

Nota: vea [string.conversions] ( 21.5 en n3242 )


Creo que usar stringstream es bastante fácil.

string toString(int n) { stringstream ss(n); ss << n; return ss.str(); } int main() { int n; cin>>n; cout<<toString(n)<<endl; return 0; }


Es bastante fácil agregar un poco de azúcar sintáctico que permite componer cuerdas sobre la marcha de una manera parecida a una corriente

#include <string> #include <sstream> struct strmake { std::stringstream s; template <typename T> strmake& operator << (const T& x) { s << x; return *this; } operator std::string() {return s.str();} };

Ahora puede agregar lo que desee (siempre que se haya definido un operador << (std::ostream& ..) ) para strmake() y usarlo en lugar de std::string .

Ejemplo:

#include <iostream> int main() { std::string x = strmake() << "Current time is " << 5+5 << ":" << 5*5 << " GST"; std::cout << x << std::endl; }


No que yo sepa, en puro C ++. Pero una pequeña modificación de lo que mencionaste.

string s = string(itoa(a));

Debería funcionar, y es bastante corto.


Primero incluye:

#include <string> #include <sstream>

Segundo agregar el método:

template <typename T> string NumberToString(T pNumber) { ostringstream oOStrStream; oOStrStream << pNumber; return oOStrStream.str(); }

Utilice el método de esta manera:

NumberToString(69);

o

int x = 69; string vStr = NumberToString(x) + " Hello word!."


Probablemente, la forma fácil más común encierra esencialmente su segunda opción en una plantilla llamada lexical_cast , como la de Boost , de modo que su código tenga este aspecto:

int a = 10; string s = lexical_cast<string>(a);

Un detalle de esto es que también admite otros modelos (por ejemplo, en la dirección opuesta también funciona).

También tenga en cuenta que aunque Boost lexical_cast comenzó simplemente escribiendo en una cadena de caracteres y luego extrayéndolo, ahora tiene un par de adiciones. En primer lugar, se han agregado especializaciones para bastantes tipos, por lo que para muchos tipos comunes, es sustancialmente más rápido que usar una cadena de caracteres. En segundo lugar, ahora verifica el resultado, así que (por ejemplo) si convierte de una cadena a un int , puede lanzar una excepción si la cadena contiene algo que no se puede convertir en una int (por ejemplo, 1234 tendría éxito, pero 123abc tiraría).

A partir de C ++ 11, hay una función std::to_string sobrecargada para tipos enteros, por lo que puede usar código como:

int a = 20; std::string s = to_string(a);

El estándar define estos como equivalentes a hacer la conversión con sprintf (utilizando el especificador de conversión que coincide con el tipo de objeto suministrado, como %d para int ), en un búfer de tamaño suficiente, luego creando una std::string de contenidos de ese buffer.


Puede usar std::to_string disponible en C ++ 11 como lo sugiere Matthieu M .:

std::to_string(42);

O, si el rendimiento es crítico (por ejemplo, si realiza muchas conversiones), puede usar fmt::FormatInt de la biblioteca de formatos C ++ para convertir un número entero en std::string :

fmt::FormatInt(42).str();

O una cadena C:

fmt::FormatInt f(42); f.c_str();

Este último no realiza ninguna asignación de memoria dinámica y es 10 veces más rápido que std::to_string en los puntos de referencia de Boost Karma. Consulte Conversión rápida de enteros a cadenas en C ++ para obtener más detalles.

A diferencia de std::to_string , fmt::FormatInt no requiere C ++ 11 y funciona con cualquier compilador de C ++.

Descargo de responsabilidad: Soy el autor de la biblioteca en formato C ++.


Retomando una discusión con @ v.oddou un par de años más tarde, C ++ 17 finalmente ha brindado una manera de hacer la solución de tipo agnóstico basada en macro originalmente (que se conserva a continuación) sin pasar por la fealdad macro.

template < typename... Args > std::string sstr( Args &&... args ) { std::ostringstream sstr; ( sstr << std::dec << ... << args ); return sstr.str(); }

Uso:

int i = 42; std::string s = sstr( "i is: ", i ); puts( sstr( i ).c_str() ); Foo x( 42 ); throw std::runtime_error( sstr( "Foo is ''", x, "'', i is ", i ) );

Respuesta original:

Dado que "convertir ... a cadena" es un problema recurrente, siempre defino la macro SSTR() en un encabezado central de mis fuentes de C ++:

#include <sstream> #define SSTR( x ) static_cast< std::ostringstream & >( / ( std::ostringstream() << std::dec << x ) ).str()

El uso es tan fácil como podría ser:

int i = 42; std::string s = SSTR( "i is: " << i ); puts( SSTR( i ).c_str() ); Foo x( 42 ); throw std::runtime_error( SSTR( "Foo is ''" << x << "'', i is " << i ) );

Lo anterior es compatible con C ++ 98 (si no puede usar C ++ 11 std::to_string ), y no necesita ningún tipo de std::to_string de terceros (si no puede usar Boost lexical_cast<> ); Sin embargo, estas otras dos soluciones tienen un mejor rendimiento.


Si necesita una conversión rápida de un número entero con un número fijo de dígitos a char * rellenado a la izquierda con ''0'', este es un ejemplo conveniente:

int n = 27; char s[8];

Si está convirtiendo un número de dos dígitos:

*(int32_t*)s = 0x3030 | (n/10) | (n%10) << 8;

Si está convirtiendo un número de tres dígitos:

*(int32_t*)s = 0x303030 | (n/100) | (n/10%10) << 8 | (n%10) << 16;

Si está convirtiendo un número de cuatro dígitos:

*(int64_t*)s = 0x30303030 | (n/1000) | (n/100%10)<<8 | (n/10%10)<<16 | (n%10)<<24;

Y así sucesivamente hasta números de siete dígitos :)


Si tienes instalado Boost (que deberías):

#include <boost/lexical_cast.hpp> int num = 4; std::string str = boost::lexical_cast<std::string>(num);


Usualmente uso el siguiente método:

#include <sstream> template <typename T> std::string NumberToString ( T Number ) { std::ostringstream ss; ss << Number; return ss.str(); }

Se describe en detalle here .


Utiliza un tipo de contador de algoritmo para convertir a una cadena. Conseguí esta técnica de la programación de computadoras Commodore 64 . También es bueno para la programación de juegos.

  • Tomas el entero y tomas cada dígito ponderado por potencias de 10. Entonces, asume que el entero es 950.

    • Si el número entero es igual o mayor que 100,000, reste 100,000 y aumente el contador en la cadena en ["000000"];
      Sigue haciéndolo hasta que no haya más números en la posición 100.000. Suelta otra potencia de diez.

    • Si el número entero es igual o mayor que 10,000, reste 10,000 y aumente el contador en la cadena en ["000000"] + 1 posición;
      Sigue haciéndolo hasta que no haya más números en la posición 10,000.

  • Suelta otra potencia de diez.

  • Repetir patrón

Sé que 950 es demasiado pequeño para usar como ejemplo, pero espero que sepas la idea.


Utilizando CString :

int a = 10; CString strA; strA.Format("%d", a);


Utilizar:

#define convertToString(x) #x int main() { convertToString(42); // Returns const char* equivalent of 42 }


Yo suelo:

int myint = 0; long double myLD = 0.0; string myint_str = static_cast<ostringstream*>( &(ostringstream() << myint) )->str(); string myLD_str = static_cast<ostringstream*>( &(ostringstream() << myLD) )->str();

Funciona en mis compiladores windows y linux g ++.


sprintf() es bastante bueno para la conversión de formato. Luego puede asignar la cadena C resultante a la cadena C ++ como lo hizo en 1.


Para C ++ 98 , hay algunas opciones:

boost/lexical_cast

Boost no es parte de la biblioteca de C ++, pero contiene muchas extensiones de biblioteca útiles.

La plantilla de función lexical_cast ofrece una forma conveniente y consistente para admitir conversiones comunes hacia y desde tipos arbitrarios cuando se representan como texto.
- Documentación de Boost

#include "boost/lexical_cast.hpp" #include <string> int main() { int x = 5; std::string x_str = boost::lexical_cast<std::string>(x); return 0; }

En cuanto al tiempo de ejecución, la operación lexical_cast toma aproximadamente 80 microsegundos (en mi máquina) en la primera conversión, y luego se acelera considerablemente después si se realiza de forma redundante.

itoa

Esta función no está definida en ANSI-C y no forma parte de C ++, pero es compatible con algunos compiladores.
- cplusplus.com

Esto significa que gcc / g++ no puede compilar código usando itoa .

#include <stdlib.h> int main() { int x = 5; char * x_str = new char[2]; x_str = itoa(x, x_str, 10); // base 10 return 0; }

No hay tiempo de ejecución para informar. No tengo instalado Visual Studio, que al reportedly puede compilar en itoa .

sprintf

sprintf es una función de biblioteca estándar de C que funciona en cadenas C, y es una alternativa perfectamente válida.

Compone una cadena con el mismo texto que se imprimiría si se utilizara el formato en printf, pero en lugar de imprimirse, el contenido se almacena como una cadena C en el búfer señalado por str.
- cplusplus.com

#include <stdio.h> int main() { int x = 5; char * x_str = new char[2]; int chars_written = sprintf(x_str, "%d", x); return 0; }

El encabezado stdio.h puede no ser necesario. En cuanto al tiempo de ejecución, la operación sprintf toma alrededor de 40 microsegundos (en mi máquina) en la primera conversión, y luego se acelera considerablemente si se realiza de forma redundante.

stringstream

Esta es la forma principal de la biblioteca C ++ de convertir enteros en cadenas, y viceversa. Existen funciones hermanas similares al stringstream de stringstream que limitan aún más el uso previsto del flujo, como ostringstream . El uso de ostringstream específicamente le dice al lector de su código que solo pretende usar el operador << , esencialmente. Esta función es todo lo que es particularmente necesario para convertir un número entero en una cadena. Vea esta pregunta para una discusión más elaborada.

#include <sstream> #include <string> int main() { int x = 5; std::ostringstream stream; stream << x; std::string x_str = stream.str(); return 0; }

En lo que respecta al tiempo de ejecución, la operación de ostringstream toma aproximadamente 71 microsegundos (en mi máquina), y luego se acelera considerablemente si se realiza de forma redundante, pero no tanto como las funciones anteriores .

Por supuesto, hay otras opciones, e incluso puede incluir una de estas en su propia función, pero esto ofrece una visión analítica de algunas de las más populares.


¡Usar stringstream para la conversión de números es peligroso!

Consulte http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/ donde le indica a ese operator<< inserta la salida formateada.

Dependiendo de su ubicación actual, un número entero de más de 3 dígitos podría convertirse en una cadena de 4 dígitos, agregando un separador de miles extra.

Por ejemplo, int = 1000 podría ser convertet a una cadena 1.001 . Esto podría hacer que las operaciones de comparación no funcionen en absoluto.

Así que recomiendo encarecidamente utilizar la forma std::to_string . Es más fácil y hace lo que esperas.


#include "stdafx.h" #include<iostream> #include<string> #include<string.h> std::string intToString(int num); int main() { int integer = 4782151; std::string integerAsStr = intToString(integer); std::cout << "integer = " << integer << std::endl; std::cout << "integerAsStr = " << integerAsStr << std::endl; return 0; } std::string intToString(int num) { std::string numAsStr; while (num) { char toInsert = (num % 10) + 48; numAsStr.insert(0, 1, toInsert); num /= 10; } return numAsStr; }


char * bufSecs = new char[32]; char * bufMs = new char[32]; sprintf(bufSecs,"%d",timeStart.elapsed()/1000); sprintf(bufMs,"%d",timeStart.elapsed()%1000);


int n = 123; std::string str = std::to_string(n);


namespace std { inline string to_string(int _Val) { // convert long long to string char _Buf[2 * _MAX_INT_DIG]; snprintf(_Buf, "%d", _Val); return (string(_Buf)); } }

ahora puedes usar to_string(5)


string number_to_string(int x){ if(!x) return "0"; string s,s2; while(x){ s.push_back(x%10 + ''0''); x/=10; } reverse(s.begin(),s.end()); return s; }