O C como linguagem é minúsculo - tipos, operadores, controle de fluxo, funções, ponteiros. Ele não sabe imprimir, ler um arquivo, comparar uma string nem alocar memória. Tudo isso é a biblioteca padrão: um conjunto de cabeçalhos que toda implementação conforme entrega.
Esta página é um mapa. Cada seção diz para que serve um cabeçalho, mostra um exemplo curto e funcional, e aponta para a página mais completa onde existir uma.
stdio.h - entrada e saída
O cabeçalho que você inclui primeiro em quase todo programa. Ele guarda printf e scanf, o tipo FILE e as funções de arquivo, e as funções de entrada orientadas a linha, mais seguras.
O essencial: printf, fprintf, sprintf, snprintf para saída; scanf, fscanf, sscanf, fgets, getchar para entrada; fopen, fclose, fread, fwrite, fseek para arquivos. A cobertura mais profunda está em printf, scanf e manipulação de arquivos.
Uma regra que vale carregar: nunca use gets(). Ele não tem como saber o tamanho do seu buffer e foi removido da norma no C11. fgets(buf, sizeof buf, stdin) é o substituto.
stdlib.h - utilitários gerais
O pega-tudo: memória, conversões, aleatoriedade, controle de processo, ordenação.
Destaques: malloc, calloc, realloc, free (veja memória dinâmica); atoi, atof, strtol, strtod para conversões - prefira a família strto*, que consegue reportar falha onde o atoi silenciosamente devolve 0; rand e srand (veja números aleatórios); exit, abort, getenv, system; e qsort/bsearch.
string.h - strings e blocos de memória
Strings em C são arrays de char terminados em '\0', e toda operação sobre elas é uma chamada de função.
Dois hábitos impedem que esse cabeçalho vire uma fonte de estouros de buffer: sempre saiba o tamanho do destino, e lembre que strcmp devolve 0 para igualdade - if (strcmp(a, b)) é verdadeiro quando as strings diferem. Funções de string cobre em detalhe os padrões mais seguros com strncpy/snprintf.
math.h - matemática
sqrt, pow, fabs, floor, ceil, round, fmod, as famílias trigonométrica e logarítmica, INFINITY e NAN.
Esse é o único cabeçalho que pode precisar de uma flag de ligação: no Linux, acrescente -lm no fim do comando de compilação, ou o ligador reporta "undefined reference to sqrt". Passeio completo em funções matemáticas.
time.h - relógios e datas
Os dois deslocamentos em struct tm pegam todo mundo: tm_year conta a partir de 1900, e tm_mon começa em 0. time(NULL) também é a semente usual para o srand.
ctype.h - classificação de caracteres
Pequeno, e mais útil do que parece. Cada função recebe um caractere e responde a uma pergunta de sim ou não, ou converte maiúsculas/minúsculas.
O conjunto completo: isalpha, isdigit, isalnum, isspace, isupper, islower, ispunct, isxdigit, isprint, além de toupper e tolower.
Repare na conversão (unsigned char). Essas funções são definidas para valores representáveis como unsigned char mais EOF; um char puro tem sinal na maioria dos sistemas, então um byte acima de 127 chega como número negativo e a chamada vira comportamento indefinido. A conversão não custa nada e elimina a classe inteira do problema.
E prefira essas funções a testes feitos à mão. c >= '0' && c <= '9' por acaso funciona, mas isdigit(c) diz o que você quer dizer e continua correto em todo lugar.
limits.h e float.h - as bordas dos tipos
Quão grande pode ficar um int nesta máquina? Esses cabeçalhos respondem, e as respostas são a razão pela qual código portável pergunta em vez de supor.
INT_MAX é como você verifica um estouro antes de ele acontecer, o que importa porque o estouro com sinal é comportamento indefinido, e não um giro que você possa testar depois.
stdbool.h e stdint.h - tipos melhores
O C não teve um tipo booleano até o C99. O <stdbool.h> fornece um:
bool, true e false são macros para _Bool, 1 e 0, mas deixam a intenção óbvia. (No C23 eles viraram palavras-chave e o cabeçalho deixou de ser necessário.)
O <stdint.h> dá tipos com larguras garantidas - essenciais para formatos de arquivo, protocolos de rede e qualquer coisa embarcada, onde "um int provavelmente tem 32 bits" não é bom o bastante:
As macros no estilo PRId32, de <inttypes.h>, expandem para o especificador correto do printf para cada tipo de largura fixa na plataforma atual - que é a forma portável de imprimi-los, já que %d é certo para int32_t em alguns sistemas e errado em outros.
assert.h - conferindo suas suposições
assert(expr) não faz nada quando a expressão é verdadeira e aborta o programa com uma mensagem quando é falsa.
Compilar com -DNDEBUG remove todas as asserções, então elas não custam nada numa build de release. E esse é também o alerta: nunca coloque um efeito colateral dentro de um assert. assert(read_next() > 0) deixa de ler por completo na build de release, e o bug resultante aparece só em produção.
Asserções são para os seus erros - condições que deveriam ser impossíveis se o código estiver correto. Entrada ruim do usuário não é uma asserção; é um if e uma mensagem de erro.
O resto, em resumo
<stddef.h>-size_t,ptrdiff_t,NULL,offsetof<stdarg.h>- funções variádicas, a maquinaria por trás doprintf<errno.h>-errnomaisperrorestrerrorpara reportar por que uma chamada falhou<signal.h>- tratamento de sinais como o Ctrl-C<setjmp.h>- saltos não locais; raramente a resposta certa<locale.h>,<wchar.h>,<wctype.h>- locales e caracteres largos<stdnoreturn.h>,<stdalign.h>,<threads.h>,<stdatomic.h>- acréscimos do C11
Dois hábitos tornam a biblioteca agradável de usar. Leia a página de manual antes de chutar uma assinatura - man 3 strtol no macOS e no Linux é autoritativo e rápido. E confira valores de retorno: malloc, fopen e strtol todos reportam falha, e um programa que os ignora falha muito mais tarde e de forma muito menos clara.
Perguntas frequentes
O que é a biblioteca padrão do C?
É o conjunto de funções, tipos e macros que toda implementação conforme do C fornece, agrupado em cerca de 30 cabeçalhos. Ela cobre entrada e saída (<stdio.h>), memória e conversões (<stdlib.h>), strings (<string.h>), matemática (<math.h>), tempo, classificação de caracteres e os limites dos tipos numéricos. O C não tem E/S nem manipulação de strings embutidas - tudo isso vem daqui.
Qual a diferença entre stdio.h e stdlib.h?
<stdio.h> é entrada e saída: printf, scanf, fopen, fgets, FILE. <stdlib.h> são utilitários gerais: malloc e free, atoi e strtol, rand e srand, exit, qsort, bsearch. Um programa típico inclui os dois.
O que o ctype.h faz?
Ele classifica e converte caracteres individuais: isdigit, isalpha, isalnum, isspace, isupper, islower, ispunct, além de toupper e tolower. Usá-los em vez de comparações feitas à mão como c >= '0' && c <= '9' é mais claro e correto em qualquer locale e conjunto de caracteres.
Preciso ligar alguma biblioteca para usar a biblioteca padrão do C?
Não, com uma exceção: as funções matemáticas. A biblioteca padrão do C é ligada automaticamente, mas no Linux as implementações de <math.h> moram numa biblioteca separada, então sqrt e companhia precisam de -lm no fim do comando de compilação. Todo o resto só precisa do #include certo.