4.6 KiB
4.6 KiB
ft_printf
Description
ft_printf est un projet de l'École 42 qui consiste à recoder la fonction printf de la libc. Ce projet permet de comprendre en profondeur le fonctionnement des fonctions variadiques et de la gestion de format en C.
Objectifs pédagogiques
- Maîtriser les fonctions variadiques (
va_list,va_start,va_arg,va_end) - Comprendre le parsing de format strings
- Gérer différents types de données et leur affichage
- Optimiser les performances d'affichage
- Respecter le comportement exact de printf
Conversions supportées
Conversions obligatoires
%c- Caractère unique%s- Chaîne de caractères%p- Pointeur (adresse mémoire en hexadécimal)%d- Entier décimal signé%i- Entier décimal signé%u- Entier décimal non signé%x- Entier hexadécimal minuscules%X- Entier hexadécimal majuscules%%- Caractère pourcentage littéral
Bonus (flags, width, precision)
- Flags :
-,0,#,,+ - Width : largeur minimale d'affichage
- Precision : précision pour les nombres/strings
Technologies utilisées
- Langage : C (C99)
- Fonctions variadiques :
stdarg.h - Gestion mémoire : malloc/free
- I/O : write system call uniquement
Installation et compilation
1. Cloner le projet
git clone <repository-url>
cd ft_printf
2. Compiler la bibliothèque
make
3. Nettoyer les fichiers objets
make clean # Supprime les .o
make fclean # Supprime tout + la bibliothèque
make re # Recompile tout
4. Utiliser dans un projet
#include "ft_printf.h"
// Compiler avec : gcc -L. -lftprintf main.c
Structure du projet
ft_printf/
├── Makefile # Compilation
├── ft_printf.h # Header principal
├── ft_printf.c # Fonction principale
├── utils.c # Fonctions utilitaires
└── README.md # Documentation
Utilisation
Syntaxe de base
#include "ft_printf.h"
int main(void)
{
ft_printf("Hello %s!\n", "World");
ft_printf("Number: %d\n", 42);
ft_printf("Hex: %x\n", 255);
ft_printf("Pointer: %p\n", &main);
return (0);
}
Exemples de conversions
// Caractères et strings
ft_printf("Char: %c\n", 'A'); // Char: A
ft_printf("String: %s\n", "Hello"); // String: Hello
// Nombres entiers
ft_printf("Decimal: %d\n", 42); // Decimal: 42
ft_printf("Integer: %i\n", -42); // Integer: -42
ft_printf("Unsigned: %u\n", 42U); // Unsigned: 42
// Hexadécimal
ft_printf("Hex lower: %x\n", 255); // Hex lower: ff
ft_printf("Hex upper: %X\n", 255); // Hex upper: FF
// Pointeurs
ft_printf("Address: %p\n", ptr); // Address: 0x7fff5fbff710
// Pourcentage littéral
ft_printf("Percentage: %%\n"); // Percentage: %
Implémentation
Architecture générale
- Parsing de la format string
- Identification du type de conversion
- Extraction des arguments avec
va_arg - Conversion vers string/affichage
- Écriture avec write()
Gestion des types
int ft_printf(const char *format, ...)
{
va_list args;
va_start(args, format);
// Parse format string
// Handle each conversion specifier
// Use va_arg to get arguments
va_end(args);
return (chars_written);
}
Fonctions utilitaires
- Conversion nombres → strings
- Gestion base hexadécimale
- Calcul longueur des nombres
- Affichage optimisé
Tests et validation
Tests de base
# Comparaison avec printf système
gcc -o test_printf test.c -L. -lftprintf
./test_printf
Tests automatisés
- Comparaison output avec printf original
- Tests edge cases (NULL pointers, 0, INT_MAX/MIN)
- Tests de performance
- Memory leak detection
Contraintes et spécifications
Normes 42
- Norme de codage stricte
- Pas de variables globales
- Gestion d'erreurs appropriée
- Pas de memory leaks
Fonctions autorisées
malloc,freewriteva_start,va_arg,va_copy,va_end
Valeur de retour
- Nombre de caractères affichés
- -1 en cas d'erreur (comme printf)
Performance et optimisations
- Buffer interne pour réduire les appels write
- Conversion directe sans sprintf
- Gestion efficace des strings longues
- Précalcul des tailles d'affichage
Compétences développées
- Fonctions variadiques en C
- Parsing et traitement de chaînes
- Conversion de types de données
- Optimisation des I/O
- Gestion mémoire rigoureuse
Auteur
Alexandre Pommier (apommier) - École 42
Licence
Projet académique - École 42