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

  1. Convierte las cadenas "42", "-17", " 100 " y "3abc" con atoi y muestra los resultados.
  2. Repite la conversión con strtol detectando errores de formato y desbordamiento.

Solución en C

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

void convertir_strtol(const char *s) {
    char *fin;
    errno = 0;
    long val = strtol(s, &fin, 10);

    if (fin == s) {
        printf("  strtol(\"%s\"): ERROR - no hay dígitos\n", s);
    } else if (errno != 0) {
        printf("  strtol(\"%s\"): ERROR - desbordamiento\n", s);
    } else if (*fin != '\0') {
        printf("  strtol(\"%s\"): %ld  (resto: \"%s\")\n", s, val, fin);
    } else {
        printf("  strtol(\"%s\"): %ld  OK\n", s, val);
    }
}

int main(void) {
    /* 1. atoi */
    const char *casos[] = {"42", "-17", "  100  ", "3abc", "abc", NULL};
    printf("atoi:\n");
    for (int i = 0; casos[i]; i++)
        printf("  atoi(\"%s\") = %d\n", casos[i], atoi(casos[i]));

    /* 2. strtol con detección de errores */
    printf("\nstrtol:\n");
    const char *casos2[] = {"42", "-17", "3abc", "abc", "99999999999", NULL};
    for (int i = 0; casos2[i]; i++)
        convertir_strtol(casos2[i]);

    return 0;
}

Resultado esperado

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
atoi:
  atoi("42") = 42
  atoi("-17") = -17
  atoi("  100  ") = 100
  atoi("3abc") = 3
  atoi("abc") = 0

strtol:
  strtol("42"): 42  OK
  strtol("-17"): -17  OK
  strtol("3abc"): 3  (resto: "abc")
  strtol("abc"): ERROR - no hay dígitos
  strtol("99999999999"): ERROR - desbordamiento

Errores frecuentes

  • Usar atoi para validar entradas del usuario: devuelve 0 para "abc" y para "0", sin forma de distinguir entre los dos casos.
  • No inicializar errno = 0 antes de strtol: errno puede contener un valor de una operación anterior, produciendo falsos positivos de error.
  • No comprobar que fin != s: si fin == s no 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; con 0 detecta automáticamente 0x (hex) y 0 (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

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.