Champ Valeur
Auteur·e Élise
Édition 2024-02-14
Durée 2~3 semaines
Taille des équipes 1~2 personnes
login des auteurs·rices dans author.txt
Rendu via git, dépôt $YEAR_printf, droits en lecture à delivery_collector
Compilation make avec règles all, clean, fclean, re
Binaires printf.a : bibliothèque
ut.out : tests unitaires

Barème

Critères Points
insertion d’un format 2
insertion de plusieurs formats 3
%c 2
%s 2
%d 2
%p 4
%b, %x, %o 4
tests unitaires 5
Total des critères 24
Malus par ligne contenant une faute de norme -0,5
Malus dépôt sale -5
Note maximale 20

Règlement de projet

Prévention de la triche

La réalisation de cet exercice est assujettie aux règles en vigueur dans l’école en matière de triche et de normalisation. Tricher vous expose à de graves sanctions.

Vous devez respecter les règles de normalisation suivantes : https://git.ecole-89.com/eriizu/coding_style/src/branch/main/norm.md

Le non-respect de la norme vous fera perdre une partie ou la totalité des points qui auraient pu être acquis, sur l’ensemble du rendu.

Fichiers à rendre et compilation

La structure de votre dépôt doit être la suivante :

  • Makefile à la racine de votre dépôt
  • fichiers *.c dans src/
  • fichiers *.h dans include/
  • fichiers *.c de tests unitaires criterion dans test/

Votre Makefile doit au minimum avoir les règles all, clean, fclean et re

Vous devez aussi avoir une recette par binaire demandé dans le cartouche de sujet. La recette all doit dépendre de celles de binaires demandés.

Tests unitaires

Chacune de vos fonctions doit avoir des tests unitaires associés.

Fonctions autorisées et interdites

Pour tout le sujet, les fonctions autorisées sont :

  • write
  • malloc
  • free
  • va_start
  • va_arg
  • va_end

Consignes

Votre travaille consiste à implémenter la fonction suivante

int stu_dprintf(int fd, const char *pattern, ...);

Elle se comporte comme dprintf des bibliothèques dans les cas qui suivent. Elle renvoie le nombre de caractères qu’elle a réussi à écrire.

Ses paramètres sont :

  • fd : le descripteur de fichier sur lequel écrire ;
  • pattern : la chaîne a afficher qui contient des formats ;
  • ... les arguments variadiques.

Vous devez au moins implémenter les formats suivants :

  • %c pour les caractères individuels ;
  • %s pour les chaînes de caractères ;
  • %d pour les entiers à afficher en base 10 ;
  • %p pour les pointeurs à afficher en base 16 ;
  • %x pour les entiers à afficher en base 16 ;
  • %b pour les entiers à afficher en binaire ;
  • %o pour les entiers à afficher en base 8 ;
  • %% pour afficher le symbole %.

Pour les nombres entiers, vous devez implémenter le modificateur +. Regardez ce qu’il fait dans le man printf.3.

Exemple de code :

int n;  
char *str;  

n = stu_dprintf(1, "%d\n", 12);  
stu_dprintf(2, "bytes printed %d\n", n);  
stu_dprintf(1, "%+d\n", 56);  
str = NULL;  
stu_dprintf(1, "addr is %p\n", str);  
str = strdup("LUIGI");  
stu_dprintf(1, "addr is %p and str %s\n", str, str);

Sa sortie :

$ ./a.out 2> /dev/null  
12
+56
addr is (null)
addr is 0x45654565 and str LUIGI
$ ./a.out > /dev/null
bytes printed 3