¿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.
to_string
likestd::string s = std::to_string(42)
¿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.
to_string
likestd::string s = std::to_string(42)
Respuestas:
Puede usar 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
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:
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:
#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();
}
#include <sstream>
.
std::
;)
Si no puede usarlo std::to_string
desde 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 lostd::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.
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_string
sobrecargas (tenga en cuenta que el valor predeterminado es base-10).
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()
o stricmp()
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
o 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::dec
es una forma libre de efectos secundarios para convertir lo anónimo ostringstream
en genérico ostream
para 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_cast
devuelve el tipo de nuevo para ostringstream
que 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;
}
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 el ostream
visible 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í.
Puede usar esta función para convertir int
a std::string
después de incluir <sstream>
:
#include <sstream>
string IntToString (int a)
{
stringstream temp;
temp<<a;
return temp.str();
}
Puede incluir la implementación de itoa en su proyecto.
Aquí está modificado para trabajar con std :: string: http://www.strudel.org.uk/itoa/
#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/
Supongamos que tengo integer = 0123456789101112
. Ahora, este entero se puede convertir en una cadena por la stringstream
clase.
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;
}