Solo tengo una pregunta rápida. He buscado bastante en Internet y he encontrado algunas soluciones, pero ninguna de ellas ha funcionado todavía. Mirando la conversión de una cadena a un int y no me refiero a los códigos ASCII.
Para un desmantelamiento rápido, se nos pasa en una ecuación como una cadena. Debemos dividirlo, formatearlo correctamente y resolver las ecuaciones lineales. Ahora, al decir eso, no puedo convertir una cadena en un int.
Sé que la cadena tendrá el formato (-5) o (25), etc., así que definitivamente es un int. Pero, ¿cómo extraemos eso de una cadena?
Una forma en la que estaba pensando es ejecutar un bucle for / while a través de la cadena, verificar un dígito, extraer todos los dígitos después de eso y luego mirar para ver si había un '-' inicial, si es así, multiplique el int por - 1)
Sin embargo, parece un poco complicado para un problema tan pequeño. ¿Algunas ideas?
atoi()
?std::string
myString
y quieres usaratoi
, entonces quieres deciratoi(myString.c_str())
.Respuestas:
En C ++ 11 hay algunas funciones de conversión nuevas y agradables
std::string
a un tipo de número.Entonces en lugar de
puedes usar
donde
str
es su número comostd::string
.Hay versiones para todos los sabores de los números:
long stol(string)
,float stof(string)
,double stod(string)
, ... ver http://en.cppreference.com/w/cpp/string/basic_string/stolfuente
"11x"
a entero11
.from_chars
C ++ 17? Se supone que son órdenes de magnitud más rápido questoi
.stoi
Debería ser preferido. Consulte ¿Por qué no debería usar atoi ()?Para estar completamente correcto, querrá verificar las marcas de error.
fuente
-5
de(-5)
.Las posibles opciones se describen a continuación:
1. Primera opción: sscanf ()
Este es un error (también mostrado por cppcheck) porque "scanf sin límites de ancho de campo puede bloquearse con grandes datos de entrada en algunas versiones de libc" (ver aquí y aquí ).
2. Segunda opción: std :: sto * ()
Esta solución es corta y elegante, pero solo está disponible en compiladores compatibles con C ++ 11.
3. Tercera opción: corrientes
Sin embargo, con esta solución es difícil distinguir entre una entrada incorrecta (ver aquí ).
4. Cuarta opción: Boost's lexical_cast
Sin embargo, esto es solo un resumen
sstream
, y la documentación sugiere utilizarsstream
para una mejor gestión de errores (ver aquí ).5. Quinta opción: strto * ()
Esta solución es muy larga, debido a la gestión de errores, y se describe aquí. Como ninguna función devuelve un int simple, se necesita una conversión en caso de un número entero (vea aquí cómo se puede lograr esta conversión).
6. Sexta opción: Qt
Conclusiones
En resumen, la mejor solución es C ++ 11
std::stoi()
o, como segunda opción, el uso de bibliotecas Qt. Todas las demás soluciones están desaconsejadas o tienen errores.fuente
use la función atoi para convertir la cadena a un entero:
http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/
fuente
atoi
.strtol
hace todo lo queatoi
hace, pero mejor, y falla con seguridad.¿Qué pasa con Boost.Lexical_cast ?
Aquí está su ejemplo:
fuente
Es cierto que mi solución no funcionaría para enteros negativos, pero extraerá todos los enteros positivos del texto de entrada que contenga enteros. Hace uso de
numeric_only
locale:Texto de entrada:
Enteros de salida:
La clase
numeric_only
se define como:Demo en línea completa: http://ideone.com/dRWSj
fuente
Probablemente sea un poco exagerado, pero
boost::lexical_cast<int>( theString )
debería funcionar bastante bien.fuente
boost::lexical_cast<int>( theString )
(dondetheString
está el nombre de la variable que contiene la cadena a la que desea convertirint
).atoi
es una función incorporada que convierte una cadena en un número entero, suponiendo que la cadena comienza con una representación entera.http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/
fuente
atoi
, usestrtol
en su lugar.En Windows, puedes usar:
strtol
,stringstream
debe especificar la base si necesita interpretar hexdecimal.fuente
Bueno, muchas respuestas, muchas posibilidades. Lo que me falta aquí es un método universal que convierte una cadena a diferentes tipos integrales de C ++ (short, int, long, bool, ...). Se me ocurrió la siguiente solución:
Aquí hay ejemplos de uso:
¿Por qué no simplemente usar el operador de salida de secuencia de cadena para convertir una cadena en un tipo integral? Aquí está la respuesta: Digamos que una cadena contiene un valor que excede el límite para el tipo integral previsto. Por ejemplo, en Wndows 64 max int es 2147483647. Asignemos a una cadena un valor max int + 1: string str = "2147483648". Ahora, al convertir la cadena a un int:
x se convierte en 2147483647, lo que definitivamente es un error: no se suponía que la cadena "2147483648" se convirtiera al int 2147483647. La función proporcionada toIntegralType detecta dichos errores y genera una excepción.
fuente
De http://www.cplusplus.com/reference/string/stoi/
Salida:
2001, Una odisea del espacio: 2001 y [, Una odisea del espacio]
40c3: 16579
-10010110001: -1201
0x7f: 127
fuente
Mi código:
fuente
fuente
Para convertir de una representación de cadena a un valor entero, podemos usar std :: stringstream.
Si el valor convertido está fuera de rango para el tipo de datos entero, devuelve INT_MIN o INT_MAX.
Además, si el valor de la cadena no se puede representar como un tipo de datos int válido, se devuelve 0.
Salida: 50
Según el resultado anterior, podemos verlo convertido de números de cadena a número entero.
Fuente y más en cadena a int c ++
fuente
Versión de una línea:
long n = strtol(s.c_str(), NULL, base);
.(
s
es la cadena ybase
es unint
tal como 2, 8, 10, 16.)Puede consultar este enlace para obtener más detalles de
strtol
.La idea central es utilizar la
strtol
función, que se incluye encstdlib
.Dado que
strtol
solo se maneja conchar
matriz, necesitamos convertirstring
achar
matriz. Puedes consultar este enlace .Un ejemplo:
que dará como resultado:
fuente
hay otra manera fácil: supongamos que tienes un personaje como
c='4'
por lo tanto, puede realizar uno de estos pasos:1er: int q
q=(int) c ; (q is now 52 in ascii table ) . q=q-48; remember that adding 48 to digits is their ascii code .
la segunda forma:
q=c-'0'; the same , character '0' means 48
fuente
string
aint
más que dechar
astring
.