Home / Lenguajes / Como convertir una cadena a entero en C de forma segura
Como convertir una cadena a entero en C de forma segura

Como convertir una cadena a entero en C de forma segura

12 October 2026 · 7 min de lectura ··

Introduccion a la conversion de cadenas a enteros en C

La conversion de una cadena de caracteres a un valor entero es una operacion frecuente al procesar datos de entrada del usuario, argumentos de linea de comandos, archivos de configuracion o respuestas de red. En C y C++, las cadenas se representan como arreglos de caracteres terminados en nulo, y las funciones de la biblioteca estandar permiten interpretar su contenido como numeros.

Existen varias funciones para esta tarea, pero no todas ofrecen el mismo nivel de control ni de deteccion de errores. La funcion atoi convierte de forma sencilla, pero no informa si la conversion fallo o si el valor desborda el rango del tipo. La funcion strtol proporciona informacion adicional mediante un puntero al primer caracter no convertido y mediante la variable errno, lo que permite validar la entrada de forma completa.

Esta guia examina las funciones disponibles, ilustra su uso con ejemplos y presenta un patron de conversion segura que comprueba que la cadena entera fue consumida y que el valor se encuentra dentro del rango esperado. El enfoque se aplica tanto a codigo C como a C++, ya que las funciones de la biblioteca estandar de C estan disponibles en ambos lenguajes.

Funciones estandar para la conversion

La cabecera stdlib.h declara las funciones principales de conversion. atoi recibe un puntero a una cadena y devuelve un int. strtol recibe la cadena, un puntero a puntero que se actualiza con la posicion donde termino la conversion y un entero que indica la base numerica.

#include <stdlib.h>

const char *cadena = "123";
int valor = atoi(cadena);

strtol permite especificar la base. El valor 10 indica decimal, 16 hexadecimal y 0 permite que la funcion detecte la base a partir de un prefijo como 0x. El puntero endptr, si no es nulo, apunta al primer caracter que no formo parte del numero.

#include <stdlib.h>

const char *cadena = "1010";
char *resto;
long valor = strtol(cadena, &resto, 2);

strtoumax y strtoul manejan enteros sin signo de mayor capacidad. Estas funciones resultan utiles cuando el valor esperado puede superar el rango de un long con signo.

Uso de la funcion atoi y sus limitaciones

atoi es la funcion mas sencilla. Ignora los espacios iniciales, lee un signo opcional y consume digitos hasta encontrar un caracter no numerico. Si la cadena no comienza con un numero valido, devuelve cero. El desbordamiento produce comportamiento no definido.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    printf("%d\n", atoi("42"));
    printf("%d\n", atoi("  -17 resto"));
    printf("%d\n", atoi("abc"));
    return 0;
}

Debido a que no existe forma de distinguir un cero legitimo de una conversion fallida, atoi no es adecuada para datos de origen externo. Su uso se limita a situaciones controladas en las que la cadena se conoce de antemano y se ha validado por otros medios.

Conversion con strtol para bases numericas y manejo de errores

strtol constituye la herramienta recomendada para conversiones robustas. Antes de la llamada se establece errno a cero. Despues de la conversion se examina endptr para verificar que se consumio la cadena completa y se comprueba errno para detectar desbordamiento.

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <limits.h>

int convertir_seguro(const char *texto, int *resultado) {
    char *fin;
    errno = 0;
    long valor = strtol(texto, &fin, 10);

    if (fin == texto || *fin != '\0') {
        return 0;
    }
    if (errno == ERANGE || valor < INT_MIN || valor > INT_MAX) {
        return 0;
    }
    *resultado = (int)valor;
    return 1;
}

Esta funcion devuelve uno si la conversion fue exitosa y el valor cabe en un int. Devuelve cero en cualquier otro caso. El llamador puede decidir como informar el error al usuario o como rechazar la entrada.

La base puede ser cualquier valor entre 2 y 36. Cuando se pasa cero, strtol interpreta el prefijo 0x como hexadecimal y el prefijo 0 como octal. Esta flexibilidad resulta util al procesar configuraciones o datos que pueden expresarse en distintas bases.

Manejo de enteros sin signo y valores grandes

Para valores sin signo se utiliza strtoul o strtoumax. Estas funciones siguen el mismo patron de endptr y errno. El tipo uintmax_t garantiza la capacidad maxima disponible en la plataforma.

#include <inttypes.h>
#include <stdlib.h>

const char *cadena = "4294967295";
char *resto;
uintmax_t valor = strtoumax(cadena, &resto, 10);

Al igual que con strtol, es necesario comprobar que resto apunta al final de la cadena y que no se produjo desbordamiento. La conversion a un tipo mas pequeno, como unsigned int, requiere una verificacion adicional de rango.

Uso de sscanf para conversion desde cadenas

sscanf permite extraer valores de una cadena utilizando especificadores de formato. Para un entero se utiliza %d. La funcion devuelve el numero de elementos asignados, lo que permite detectar si la conversion tuvo exito.

#include <stdio.h>

int n;
const char *s = "42";
if (sscanf(s, "%d", &n) == 1) {
    /* conversion exitosa */
}

sscanf no informa de desbordamiento de forma fiable en todos los casos y puede aceptar cadenas con caracteres adicionales si no se utiliza un especificador que exija el final de la cadena. Para validacion estricta, strtol con comprobacion de endptr ofrece mayor control.

Representacion entera de caracteres y conversion de un solo digito

Cuando se necesita convertir un unico caracter digito a su valor numerico, la resta del caracter ‘0’ produce el resultado. Esta tecnica es eficiente y no requiere llamadas a funciones.

char c = '5';
if (c >= '0' && c <= '9') {
    int digito = c - '0';
}

La comprobacion de rango evita interpretar caracteres no digitos. Esta operacion es comun en el analisis de cadenas caracter a caracter o en la implementacion de analizadores simples.

Optimizacion y manejo de errores en la conversion

La validacion completa con strtol anade unas pocas instrucciones, pero elimina una clase completa de errores silenciosos. En codigo que procesa entradas de usuario o datos de red, el coste es insignificante comparado con el riesgo de interpretar incorrectamente un valor.

Encapsular la logica de conversion en una funcion reutilizable mejora la consistencia y facilita las pruebas. La funcion puede devolver un codigo de error o un valor opcional segun el estilo del proyecto. Documentar el contrato, indicando que la funcion rechaza espacios finales y caracteres no numericos, ayuda a otros desarrolladores.

Cuando el rendimiento es critico y la entrada esta controlada, atoi puede utilizarse, pero debe documentarse la suposicion de que la cadena es valida. En la mayoria de los casos, el patron basado en strtol es preferible.

Aplicaciones practicas

La conversion segura de cadenas a enteros aparece en la lectura de argumentos de linea de comandos, en el analisis de archivos de configuracion y en el procesamiento de protocolos de texto. Un servidor que recibe un numero de puerto como cadena debe rechazar valores fuera del rango valido en lugar de aceptar un cero silencioso.

En C++ se puede envolver la funcion de C en un metodo que lance una excepcion o devuelva un std::optional. Las funciones std::stoi y std::stol de la biblioteca estandar de C++ ofrecen una interfaz orientada a objetos, pero internamente pueden utilizar mecanismos similares y lanzan excepciones en caso de error.

Conclusiones

La conversion de una cadena a un entero en C se realiza de forma segura con strtol, comprobando el puntero de fin y el valor de errno. Esta funcion permite detectar cadenas invalidas, caracteres residuales y desbordamientos, a diferencia de atoi, que no proporciona informacion de error. El patron de validacion completo puede encapsularse en una funcion reutilizable que devuelve un indicador de exito y el valor convertido.

Para un unico digito, la resta del caracter ‘0’ es suficiente y eficiente. sscanf ofrece una alternativa cuando el formato de la cadena es conocido, pero no sustituye la validacion estricta que proporciona strtol. Aplicar estas tecnicas de forma consistente produce codigo mas robusto frente a entradas inesperadas y facilita el mantenimiento a largo plazo.