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 deprintf<errno.h>:errnomásperrorystrerrorpara 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.