Champ Valeur
Auteur·e Élise
Édition 2024-02-14
Durée une demie journée
Taille des équipes 1~2 personnes
login des auteurs·rices dans author.txt
Rendu via git, dépôt $YEAR_tp_variadique, droits en lecture à delivery_collector
Compilation Par exercice :
gcc -Wall -Wextra -Werror
Binaires aucun

Barème

Critères Points
vputs 7
mutli_print 7
mini_printf 6
Total des critères 20
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

Respectez à la lettre les noms de fichiers et leur emplacement dans le dépôt de rendu. S’il vous est demandé de rendre un fichier nommé hello.c sans qu’un nom de dossier soit précisé : rendez un fichier hello.c à la racine de votre dépôt.

La présence d’une étoile * signifie que le nom du fichier peut être n’importe lequel dès lors qu’il porte l’extension ou l’affixe (préfixe/suffixe) demandée. Elle signifie aussi qu’il est possible de rendre plusieurs fichiers.

La présence d’une double étoile ** signifie que les fichiers peuvent être placés n’importe où dans un dossier, y compris dans des sous-dossiers.

Pensez à faire des commits et des push fréquemment. Autrement nous ne pouvons pas vous aider à retrouver vos fichiers perdus.

Fonctions autorisées et interdites

Les fonctions autorisées sont indiquées sur chaque exercice.

Exercice : Puts Variadique

Fichiers à rendre : vputs.c, vputs.main.c Fonctions autorisées : write, va_start, va_arg,

Écrivez la fonction suivante :

int stu_vputs(unsigned int nbr, ...);

Elle doit afficher toutes les chaînes reçues en argument après nbr. nbr doit avoir pour valeur le nombre de chaînes passées en argument. Après la dernière chaîne écrite, la fonction rajoute un retour à la ligne.

La fonction doit renvoyer le nombre de caractères écrits.

Exemple d’appel :

stu_vputs(3, "hello ", "world ", "this is me");

Une fonction en C peut prendre un nombre variable d’argument. Mais la seule façon pour une fonction de savoir avec combien d’argument elle a été appelée, c’est de recevoir en argument une valeur qui lui indique.

Ici c’est le rôle de notre premier paramètre. nbr doit avoir pour valeur le nombre d’argument qu’on l’on écrit après lui.

va_list c’est un type, c’est la valeur de retour de va_start, et le paramètre de va_arg et va_end.

va_start permet d’initialiser va_list. On lui donne le nom du dernier paramètre qui n’est pas variadique dans notre fonction. En l’occurrence c’est nbr.

va_arg prend en paramètre une va_list et le type de l’argument que l’on veut lire.

Enfin va_end permet de détruire proprement une va_list. C’est une sorte de free.

Exercice : Multi Print

Fichiers à rendre : multi_print.c, multi_print.main.c Fonctions autorisées : toutes les fonctions variadiques, write

int multi_print(const char *pattern, ...);
multi_print("csd", 'a', " hello ", 12);

Affiche :

a hello 12

Votre fonction doit itérer sur tous les caractères de pattern. Lorsque vous rencontrez :

  • c extrayez un caractère avec va_arg et affichez-le ;
  • s : extrayez un char * avec va_arg et affichez-le ;
  • d : extrayez un int avec va_arg et affichez-le ;
  • tout autre caractère : ne faites rien, passez juste au suivant.

Exercice : Mini Printf

Fichiers à rendre : mini_printf.c, mini_print.main.c Fonctions autorisées : toutes les fonctions variadiques, write

Écrivez la fonction suivante :

int stu_mini_printf(const char *pattern, ...);

Cette fonction prend en paramètre une chaîne de caractères pattern. Elle doit se retrouvée affichée sur la sortie standard du programme à l’exception de quelques combinaisons de caractères :

  • à la place %s extrayez un char * des arguments variadiques et affichez-le ;
  • à la place de %c extrayez un char et affichez-le ;
  • à la place de %d extrayez un int et affichez-le ;
  • à la place de %% affichez un %.

La fonction renvoie le nombre d’octets qu’elle a réussi à écrire.