Usted tiene 3 opciones:
atoi
Esta es probablemente la más rápida si se está usando en el código de rendimiento crítico, pero lo hace sin el informe de errores. Si la cadena no comienza con un entero, devolverá 0. Si la cadena contiene basura después del entero, convertirá la parte inicial e ignorará el resto. Si el número es demasiado grande para caber en int
, el comportamiento no está especificado.
sscanf
Algunos informes de errores, y que tiene una gran flexibilidad para qué tipo de tienda (versiones firmadas/sin signo de char/short/int/long/long long/size_t/ptrdiff_t/intmax_t
).
El valor de retorno es el número de conversiones que se realizan correctamente, por lo que al escanear "%d"
se devolverá 0 si la cadena no comienza con un número entero. Puede usar "%d%n"
para almacenar el índice del primer carácter después del número entero que se lee en otra variable, y así verificar si se convirtió la cadena completa o si hay basura después. Sin embargo, como atoi
, el comportamiento en el desbordamiento de enteros no está especificado.
strtol
y familiares
informe de errores robusto, con tal que se establece errno
a 0 antes de realizar la llamada. Los valores de retorno se especifican en overflow y se establecerá errno
. Puede elegir cualquier base numérica del 2 al 36, o especificar 0 como la base para auto interpretar los 0x
y 0
como hex y octales, respectivamente. Las opciones de tipo para convertir a son versiones firmadas/sin firmar de long/long long/intmax_t
.
Si necesita un tipo más pequeño siempre puede almacenar el resultado en una variable temporal long
o unsigned long
y comprobar el desbordamiento usted mismo.
Dado que estas funciones toman un puntero al argumento del puntero, también se obtiene un puntero al primer carácter que sigue al entero convertido, de forma gratuita, para que pueda decir si la cadena entera era un entero o analizar datos posteriores en la cadena si necesario.
Personalmente, yo recomendaría la familia strtol
para la mayoría de propósitos. Si estás haciendo algo rápido y sucio, atoi podría satisfacer tus necesidades.
Como nota aparte, a veces me parece que necesito analizar los números en los que no se supone que se acepten espacios en blanco iniciales, signos, etc. En este caso es muy muy fácil de rodar su propio bucle, por ejemplo,
for (x=0; (unsigned)*s-'0'<10; s++)
x=10*x+(*s-'0');
o puede utilizar (por robustez):.
if (isdigit(*s))
x=strtol(s, &s, 10);
else /* error */
Posible duplicado de [Conversión de cadena en entero C] (http://stackoverflow.com/questions/7021725/converting-string-to-integer- c) –