case 'd':
    w_sd(ptr, res);
    return 1;
case 's':
    w_ptr_char(ptr, res);
    return 1;
case 'x':
    w_hexa(ptr, res);
    return 1;
S5 · 2024 48 h

TinyPrintf

Une version réduite de printf écrite en C pour comprendre les arguments variadiques, le décodage d'un format et les conversions numériques.

C99 stdarg.h putchar Criterion

Le projet en quelques mots

printf reçoit une chaîne qui mélange du texte et des marqueurs comme %d ou %s. TinyPrintf reproduit ce principe avec un périmètre volontairement limité.

La fonction parcourt le format, récupère les arguments au fur et à mesure, les écrit sur la sortie standard avec putchar(), puis renvoie le nombre de caractères affichés. L'exercice impose ainsi de construire les conversions sans appeler la fonction printf de la bibliothèque standard.

Du format au texte affiché

1

Lire le format

La chaîne est parcourue caractère par caractère.

2

Reconnaître une directive

Un caractère % déclenche l'analyse du caractère suivant.

3

Récupérer l'argument

va_list et va_arg donnent accès à la valeur attendue.

4

Convertir la valeur

Les entiers sont décomposés récursivement en base 8, 10 ou 16.

5

Afficher et compter

Chaque caractère passe par putchar() et incrémente le résultat.

Directives prises en charge

%d

Entier décimal signé

%u

Entier décimal non signé

%o

Écriture en base octale

%x

Écriture hexadécimale en minuscules

%s

Chaîne, avec (null) pour un pointeur nul

%c

Caractère ASCII

%%

Caractère pour cent littéral

Une directive inconnue n'est pas consommée : par exemple, %q est recopié tel quel dans la sortie.

État du rendu conservé

Ce qui a été vérifié

La cible make all compile le fichier objet avec les options C99 strictes demandées. Le dépôt contient également 45 tests Criterion portant sur la sortie produite et la valeur de retour.

Test ciblé de la fonction

Un banc de test indépendant confirme le texte ordinaire, les sept directives et le comptage sur des valeurs usuelles. La suite Criterion n'a pas pu être relancée localement car la bibliothèque n'est pas installée.

Limites observées

La copie conservée n'est pas entièrement conforme au sujet : elle contient une fonction main alors qu'aucune n'était attendue, inclut stdio.h hors de la liste autorisée et n'appelle pas va_end. Les cas limites %d avec zéro ou INT_MIN, ainsi que %o avec une grande valeur non signée, produisent aussi une sortie incorrecte. La page décrit donc le rendu présent sans revendiquer une compatibilité complète avec printf.

Synthèse du projet

Travail réalisé

Le rendu met en place le parcours du format, la lecture d'arguments variadiques, sept directives et des conversions récursives pour les représentations décimale, octale et hexadécimale. Il compte les caractères au moment où ils sont écrits sur la sortie standard.

Ce que le projet m'a apporté

TinyPrintf m'a fait pratiquer les fonctions variadiques, la représentation des nombres dans plusieurs bases et le traitement précis d'une chaîne de format. L'audit des cas extrêmes rappelle aussi l'importance des bornes des types entiers et de tests qui dépassent les exemples nominaux.