atoi en C: ejercicio resuelto
atoi en C: ejercicio resuelto
Si buscas atoi en C ejercicio resuelto, aquí tienes los patrones clave: convertir cadenas a entero con atoi, detectar sus limitaciones (sin manejo de errores) y la alternativa recomendada con strtol que permite detectar entradas inválidas.
atoi (ASCII to integer) es la función más simple para la conversión, pero devuelve 0 tanto para "0" como para entradas inválidas como "abc", lo que la hace inadecuada cuando hay que distinguir un error de un valor legítimo.
Enunciado
- Convierte las cadenas
"42","-17"," 100 "y"3abc"conatoiy muestra los resultados. - Repite la conversión con
strtoldetectando errores de formato y desbordamiento.
Solución en C
Resultado esperado
Errores frecuentes
- Usar
atoipara validar entradas del usuario: devuelve 0 para"abc"y para"0", sin forma de distinguir entre los dos casos. - No inicializar
errno = 0antes destrtol:errnopuede contener un valor de una operación anterior, produciendo falsos positivos de error. - No comprobar que
fin != s: sifin == sno se consumió ningún dígito, la cadena no contenía un número. - Confundir el tercer parámetro de
strtol(la base) con la longitud:strtol(s, &fin, 10)usa base 10; con0detecta automáticamente0x(hex) y0(octal).
Aplicación práctica
La conversión de cadena a entero aparece en el parseo de argumentos de línea de comandos, en la lectura de ficheros de configuración y en la deserialización de datos de red. strtol es el estándar de la industria para este propósito en C.
Siguiente ejercicio recomendado
- strtol en C: ejercicio resuelto
- strtok en C: ejercicio resuelto
- sprintf y snprintf en C: ejercicio resuelto
- Todos los ejercicios de C
Práctica guiada y libro completo
Si quieres una ruta completa con progresión real de dificultad:
FAQ
¿Cuándo está bien usar atoi y cuándo es necesario strtol?
atoi es aceptable en código rápido donde se sabe con certeza que la entrada es un entero válido (por ejemplo, tras validar con isdigit). Usa strtol cuando la entrada viene del usuario, de un fichero o de la red y necesitas distinguir errores de valores legítimos.
¿Cómo convierte strtol en otras bases?
El tercer parámetro es la base: strtol(s, &fin, 16) convierte hexadecimal, strtol(s, &fin, 2) binario. Con 0 detecta automáticamente el prefijo: 0x para hex, 0 inicial para octal y sin prefijo para decimal.
¿Existe equivalente para double?
Sí: strtod(s, &fin) convierte una cadena a double con el mismo mecanismo de detección de errores mediante el puntero fin.