Há pouco tempo, desenvolvi a função ft_printf, uma versão recriada da famosa função printf() do C, seguindo a filosofia da 42 São Paulo de não utilizar funções prontas da biblioteca padrão. O objetivo principal é analisar uma string de formatação e imprimir os caracteres na saída padrão (stdout). O desafio real começa quando encontramos o caractere %, que funciona como uma flag avisando que precisamos capturar um argumento variável e formatá-lo corretamente para exibir na tela.

Eu recriei a clássica função printf() do C do zero!

Funções Variádicas em C

Para implementar o suporte para as conversões necessárias, precisei dominar o conceito de Funções Variádicas. Em C, para criar uma função capaz de receber uma quantidade n-ésima e dinâmica de argumentos passados pelo usuário, precisamos recorrer à biblioteca e suas macros:

  • va_list: um tipo de dado especial que serve para rastrear e armazenar os argumentos adicionais
  • va_start: inicializa a lista de argumentos, apontando para o primeiro elemento logo após o argumento fixo (format)
  • va_arg: resgata o próximo argumento da lista, exigindo que você informe especificamente o tipo esperado (ex.: int, char *)
  • va_end: limpa a memória e finaliza o acesso à lista de argumentos.

Entender como o computador navega pela memória empilhando esses argumentos sem que eles tenham um nome fixo foi um baita aprendizado de como as coisas funcionam por baixo dos panos.

Maiores Desafios da Implementação

Se na libft o maior vilão foi entender o gerenciamento de memória bruta com ponteiros e alocações, na ft_printf a dor de cabeça foi com a arquitetura do código e a precisão do fluxo. Os maiores desafios incluíram a saga dos Hexadecimais e Ponteiros (%p) e a meticulosa contagem de caracteres. Para lidar com o %p, precisamos injetar o prefixo 0x na frente e lidar corretamente com o caso de ponteiros nulos (NULL). A função também precisa retornar exatamente o mesmo valor inteiro que a original, que representa a contagem precisa de todos os caracteres impressos. Um desvio de um único byte sequer nos testes resulta em um projeto zerado pela Moulinette.

Jump Tables

Para economizar nos if-else, tentei bancar a esperta e economizar nos if-else, então fui em busca de alternativas. Acabei encontrando sobre

Classica Funcao Printf Recriei Zero