Métodos
42 (III): ft_printf, el printf propio
Recrear printf con variadic arguments: formateadores, anchuras y la ilusión de facilidad de una función que usamos cada día.

Cuando escribes tu primer programa, alguien te dice que printf sirve para mostrar cosas por pantalla. Nadie explica cómo hace la magia del formato: cómo sabe cuándo el %d es un entero y el %s una cadena. ft_printf es el proyecto donde eso deja de ser magia: tienes que volver a escribir printf tú mismo.
El problema
printf es una función variádica: acepta tantos argumentos como quieras, y C no te dice cuántos ni de qué tipo son. La única información es la cadena de formato, que tienes que ir recorriendo carácter a carácter: cuando encuentras un %, el siguiente carácter te dice qué hay que imprimir. Mi entorno era el conjunto clásico: %c para caracteres, %s para cadenas, %d y %i para enteros, %u, %x y %X para sin signo y hexadecimal, %p para punteros y el %% literal. Y un detalle que la documentación se salta: la función debe devolver el número total de caracteres impresos, no solo mostrarlos.
Cómo lo abordé
Separé el recorrido de la cadena de la impresión de cada tipo. Un bucle que detecta el % y una función auxiliar por cada especificador: carácter, cadena, entero, hexadecimal, puntero. Cada auxiliar imprime y cuenta, y al final se suma el total. Los casos que más sangraron fueron los que nadie prueba: una cadena NULL que hay que mostrar como (null), el valor mínimo de un entero con signo, que no se puede invertir con seguridad, y los punteros nulos. Para probar, la técnica más útil fue comparar la salida byte a byte con el printf real: si el recuento de caracteres no cuadra, algo está mal. El repositorio, 42_ft_printf, quedó ordenado en pocas piezas: la función principal, dos capas de utilidades y una cabecera.
Qué me llevé
La lección grande es sobre stdarg.h y la forma en que C pasa argumentos de longitud variable por la pila: cuando no hay tipos, todo depende de que la cadena de formato y los argumentos pasados cuadren, y el compilador no te avisará si no es así. También aprendí que las funciones cotidianas tienen mucha ingeniería invisible: printf lleva décadas de optimizaciones y extensiones, y aunque mi versión solo cubre una parte, ahora cuando la escribo sé exactamente qué pasa debajo. Y algo práctico: desde entonces, ft_printf es la función de impresión de todos mis proyectos de 42. La caja de herramientas crece.