Menu

La biblioteca estándar de C: un mapa de las cabeceras que vale la pena conocer

Qué te da cada cabecera estándar —stdio.h, stdlib.h, string.h, math.h, time.h, ctype.h, limits.h, stdbool.h, stdint.h y assert.h— con un ejemplo corto y funcional de cada una.

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

El lenguaje C es minúsculo: tipos, operadores, control de flujo, funciones, punteros. No puede imprimir, leer un archivo, comparar una cadena ni reservar memoria. Todo eso es la biblioteca estándar: un conjunto de cabeceras que toda implementación conforme incluye.

Esta página es un mapa. Cada sección dice para qué sirve una cabecera, muestra un ejemplo corto y funcional, y apunta a la página más completa donde exista.

stdio.h: entrada y salida

La cabecera que incluyes primero en casi todo programa. Contiene printf y scanf, el tipo FILE y las funciones de archivos, y las funciones de entrada por líneas más seguras.

Lo esencial: printf, fprintf, sprintf, snprintf para salida; scanf, fscanf, sscanf, fgets, getchar para entrada; fopen, fclose, fread, fwrite, fseek para archivos. La cobertura más profunda vive en printf, scanf y manejo de archivos.

Una regla que conviene llevarse: nunca uses gets(). No tiene forma de conocer el tamaño de tu búfer y fue eliminada del estándar en C11. fgets(buf, sizeof buf, stdin) es el reemplazo.

stdlib.h: utilidades generales

El cajón de sastre: memoria, conversiones, aleatoriedad, control de procesos, ordenamiento.

Lo destacado: malloc, calloc, realloc, free (mira memoria dinámica); atoi, atof, strtol, strtod para conversiones —prefiere la familia strto*, que puede reportar fallos donde atoi devuelve 0 en silencio—; rand y srand (mira números aleatorios); exit, abort, getenv, system; y qsort/bsearch.

string.h: cadenas y bloques de memoria

Las cadenas de C son arrays de char que terminan en '\0', y cada operación sobre ellas es una llamada a función.

Dos hábitos evitan que esta cabecera se convierta en una fuente de desbordamientos de búfer: conoce siempre el tamaño del destino, y recuerda que strcmp devuelve 0 cuando son iguales, así que if (strcmp(a, b)) es verdadero cuando las cadenas difieren. Funciones de cadenas cubre en detalle los patrones más seguros con strncpy/snprintf.

math.h: matemáticas

sqrt, pow, fabs, floor, ceil, round, fmod, las familias trigonométrica y logarítmica, INFINITY y NAN.

Esta es la única cabecera que puede necesitar una bandera del enlazador: en Linux, agrega -lm al final del comando de compilación o el enlazador reporta "undefined reference to sqrt". Recorrido completo en funciones matemáticas.

time.h: relojes y fechas

Los dos desplazamientos de struct tm atrapan a todo el mundo: tm_year cuenta desde 1900 y tm_mon empieza en 0. time(NULL) es también la semilla habitual de srand.

ctype.h: clasificación de caracteres

Pequeña y más útil de lo que parece. Cada función toma un carácter y responde una pregunta de sí o no, o convierte mayúsculas y minúsculas.

El conjunto completo: isalpha, isdigit, isalnum, isspace, isupper, islower, ispunct, isxdigit, isprint, más toupper y tolower.

Fíjate en la conversión (unsigned char). Estas funciones están definidas para valores representables como unsigned char más EOF; un char a secas tiene signo en la mayoría de los sistemas, así que un byte por encima de 127 llega como un número negativo y la llamada pasa a ser comportamiento indefinido. La conversión no cuesta nada y elimina toda esa clase de problema.

Y prefiere estas a las pruebas escritas a mano. c >= '0' && c <= '9' da la casualidad de funcionar, pero isdigit(c) dice lo que quieres decir y sigue siendo correcto en todas partes.

limits.h y float.h: los bordes de los tipos

¿Cuán grande puede ser un int en esta máquina? Estas cabeceras lo responden, y las respuestas son por lo que el código portable pregunta en lugar de suponer.

INT_MAX es como compruebas el desbordamiento antes de que ocurra, lo que importa porque el desbordamiento con signo es comportamiento indefinido y no una vuelta a la carga que puedas comprobar después.

stdbool.h y stdint.h: mejores tipos

C no tuvo tipo booleano hasta C99. <stdbool.h> aporta uno:

bool, true y false son macros para _Bool, 1 y 0, pero hacen obvia la intención. (En C23 pasaron a ser palabras clave y la cabecera ya no es necesaria.)

<stdint.h> da tipos con anchos garantizados, imprescindibles para formatos de archivo, protocolos de red y cualquier cosa embebida, donde "un int probablemente tiene 32 bits" no basta:

Las macros al estilo PRId32 de <inttypes.h> se expanden al especificador de printf correcto para cada tipo de ancho fijo en la plataforma actual, que es la forma portable de imprimirlos, ya que %d es correcto para int32_t en unos sistemas y equivocado en otros.

assert.h: comprobar tus suposiciones

assert(expr) no hace nada cuando la expresión es verdadera y aborta el programa con un mensaje cuando es falsa.

Compilar con -DNDEBUG elimina todas las aserciones, así que no cuestan nada en una versión de lanzamiento. Esa es también la advertencia: nunca pongas un efecto secundario dentro de un assert. assert(read_next() > 0) deja de leer por completo en la versión de lanzamiento, y el error resultante aparece solo en producción.

Las aserciones son para tus errores: condiciones que deberían ser imposibles si el código es correcto. Una entrada de usuario mala no es una aserción; es un if y un mensaje de error.

El resto, en breve

  • <stddef.h>: size_t, ptrdiff_t, NULL, offsetof
  • <stdarg.h>: funciones variádicas, la maquinaria detrás de printf
  • <errno.h>: errno más perror y strerror para reportar por qué falló una llamada
  • <signal.h>: manejo de señales como Ctrl-C
  • <setjmp.h>: saltos no locales; rara vez la respuesta correcta
  • <locale.h>, <wchar.h>, <wctype.h>: configuraciones regionales y caracteres anchos
  • <stdnoreturn.h>, <stdalign.h>, <threads.h>, <stdatomic.h>: añadidos de C11

Dos hábitos hacen agradable el uso de la biblioteca. Lee la página del manual antes de adivinar una firma: man 3 strtol en macOS y Linux es autoritativo y rápido. Y comprueba los valores de retorno: malloc, fopen y strtol reportan fallos, y un programa que los ignora falla mucho después y de forma mucho menos clara.

Preguntas frecuentes

¿Qué es la biblioteca estándar de C?

El conjunto de funciones, tipos y macros que toda implementación conforme de C provee, agrupado en unas 30 cabeceras. Cubre la entrada y salida (<stdio.h>), memoria y conversiones (<stdlib.h>), cadenas (<string.h>), matemáticas (<math.h>), tiempo, clasificación de caracteres y los límites de los tipos numéricos. C no tiene E/S ni manejo de cadenas incorporados: todo eso viene de aquí.

¿Cuál es la diferencia entre stdio.h y stdlib.h?

<stdio.h> es entrada y salida: printf, scanf, fopen, fgets, FILE. <stdlib.h> son utilidades generales: malloc y free, atoi y strtol, rand y srand, exit, qsort, bsearch. Un programa típico incluye ambas.

¿Qué hace ctype.h?

Clasifica y convierte caracteres individuales: isdigit, isalpha, isalnum, isspace, isupper, islower, ispunct, más toupper y tolower. Usarlas en lugar de comparaciones escritas a mano como c >= '0' && c <= '9' es más claro y correcto para cualquier configuración regional y conjunto de caracteres.

¿Hay que enlazar algo para usar la biblioteca estándar de C?

No, con una excepción: las funciones matemáticas. La biblioteca estándar de C se enlaza automáticamente, pero en Linux las implementaciones de <math.h> viven en una biblioteca aparte, así que sqrt y compañía necesitan -lm al final del comando de compilación. Todo lo demás solo necesita el #include correcto.

Coddy programming languages illustration

Aprende a programar con Coddy

COMENZAR