Dado que esta pregunta se hace todas las semanas, estas preguntas frecuentes pueden ayudar a muchos usuarios.
Cómo convertir un número entero en una cadena en C ++
cómo convertir una cadena en un entero en C ++
cómo convertir un número de punto flotante en una cadena en C ++
cómo convertir una cadena en un número de punto flotante en C ++
Respuestas:
Actualización para C ++ 11
Como
C++11
estándar, la conversión de cadena a número y viceversa están incorporadas en la biblioteca estándar. Todas las funciones siguientes están presentes en<string>
(según el párrafo 21.5).cadena a numérico
Cada uno de estos toma una cadena como entrada e intentará convertirla en un número. Si no se pudo construir un número válido, por ejemplo porque no hay datos numéricos o el número está fuera del rango para el tipo, se lanza una excepción (
std::invalid_argument
ostd::out_of_range
).Si la conversión tuvo éxito y
idx
no lo es0
,idx
contendrá el índice del primer carácter que no se usó para decodificar. Este podría ser un índice detrás del último carácter.Finalmente, los tipos integrales permiten especificar una base, para dígitos mayores a 9, se asume el alfabeto (
a=10
hastaz=35
). Puede encontrar más información sobre el formato exacto que se puede analizar aquí para números de punto flotante , enteros con signo y enteros sin signo .Finalmente, para cada función también hay una sobrecarga que acepta a
std::wstring
como primer parámetro.numérico a cadena
Estos son más sencillos, pasa el tipo numérico apropiado y obtiene una cadena de regreso. Para las opciones de formato, debe volver a la opción de secuencia de cadenas de C ++ 03 y usar manipuladores de secuencia, como se explica en otra respuesta aquí.
Como se señaló en los comentarios, estas funciones recurren a una precisión de mantisa predeterminada que probablemente no sea la precisión máxima. Si se requiere más precisión para su aplicación, también es mejor volver a otros procedimientos de formateo de cadenas.
También hay funciones similares definidas que se nombran
to_wstring
, estas devolverán unstd::wstring
.fuente
std::to_string
pierde mucha precisión para los tipos de coma flotante. Por ejemplo,double f = 23.4323897462387526; std::string f_str = std::to_string(f);
devuelve una cadena de 23,432390. Esto hace que sea imposible redondear valores de coma flotante utilizando estas funciones.sprintf(buf, fmt, val)
con un especificador de formato de "% d " , "% u " , "% ld " , " % lu " , "% lld " , "% llu " , "% f " , "% f " o "% Lf " , respectivamente, dondebuf
designa un búfer de caracteres interno de tamaño suficiente. "Eché un vistazo al estándar C99 para printf y creo que el número de decimales depende de#define DECIMAL_DIG
enflotar.h .Cómo convertir un número en una cadena en C ++ 03
itoa
oitof
porque no son estándar y, por lo tanto, no son portátiles.Usar secuencias de cadenas
Tenga en cuenta que también puede usar secuencias de cadenas para convertir números de punto flotante en cadenas, y también para formatear la cadena como desee, al igual que con
cout
Puede usar manipuladores de flujo, como
std::endl
,std::hex
y funcionesstd::setw()
,std::setprecision()
etc. con flujos de cadena exactamente de la misma manera que concout
No confunda
std::ostringstream
constd::ostrstream
. Este último está en desusoUtilice potenciar el elenco léxico . Si no está familiarizado con boost, es una buena idea comenzar con una biblioteca pequeña como esta lexical_cast. Para descargar e instalar boost y su documentación, vaya aquí . Aunque boost no está en el estándar C ++, muchas bibliotecas de boost se estandarizan eventualmente y boost se considera una de las mejores bibliotecas de C ++.
El elenco léxico usa secuencias debajo, así que básicamente esta opción es la misma que la anterior, solo que menos detallada.
Cómo convertir una cadena en un número en C ++ 03
La opción más ligera, heredada de C, son las funciones
atoi
(para enteros (alfabético a entero)) yatof
(para valores de punto flotante (alfabético a flotante)). Estas funciones toman una cadena de estilo C como argumento (const char *
) y, por lo tanto, su uso puede considerarse una práctica no exactamente buena en C ++. cplusplus.com tiene documentación fácil de entender tanto sobre atoi como sobre atof, que incluye cómo se comportan en caso de una entrada incorrecta. Sin embargo, el vínculo contiene un error en el sentido de que, según el estándar, si el número de entrada es demasiado grande para caber en el tipo de destino, el comportamiento no está definido.Utilice secuencias de cadenas (esta vez, secuencia de cadenas de entrada
istringstream
). Nuevamente, istringstream se usa igual quecin
. Nuevamente, no confundaistringstream
conistrstream
. Este último está en desuso.Utilice potenciar el elenco léxico .
En caso de una mala entrada,
lexical_cast
lanza una excepción de tipoboost::bad_lexical_cast
fuente
atoi
no es excelente, es incorrecta. No menciona que si el valor numérico de la cadena no se puede representarint
, entonces el comportamiento no está definido. En cambio, dice que los valores fuera de rango están sujetos aINT_MAX
/INT_MIN
, que no puedo encontrar ni en C ++ 03 ni en C89. Para entradas no confiables / no verificadas, o cuando se trata de bases que las transmisiones no admiten, necesitastrtol
, que tiene un comportamiento de error definido. Y comentarios similares paraatof
/strtod
.(int)strtol(nptr, (char **)NULL, 10)
. Las funciones [...] atoi devuelven el valor convertido". cplusplus.com es conocido por ser una increíble mala fuente de información para principiantes.istr >> i1 >> f >> i2;
pierde gravemente un control de éxito.std::to_string
En C ++ 17, las nuevas funciones std :: to_chars y std :: from_chars se introducen en el encabezado charconv .
Desde std :: to_chars , lo mismo para std :: from_chars .
Aunque no está completamente implementado por los compiladores, definitivamente se implementará.
fuente
Robé esta clase conveniente de algún lugar aquí en StackOverflow para convertir cualquier cosa que se pueda transmitir en una cadena:
Y luego lo usas como;
¡Muy ingenioso!
También utilizo esta función para convertir cadenas en cualquier cosa que se pueda transmitir, aunque no es muy seguro si intenta analizar una cadena que no contiene un número; (y tampoco es tan inteligente como el anterior)
Usar como:
Es posible que también desee versiones para wstrings.
fuente