Menu

A biblioteca padrão do C: um mapa dos cabeçalhos que vale conhecer

O que cada cabeçalho padrão oferece - stdio.h, stdlib.h, string.h, math.h, time.h, ctype.h, limits.h, stdbool.h, stdint.h e assert.h - com um exemplo curto e funcional de cada um.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

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 do printf
  • <errno.h> - errno mais perror e strerror para 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.

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR