TP 1 • variadique
| 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 :
cextrayez un caractère avecva_arget affichez-le ;s: extrayez unchar *avecva_arget affichez-le ;d: extrayez unintavecva_arget 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
%sextrayez unchar *des arguments variadiques et affichez-le ; - à la place de
%cextrayez uncharet affichez-le ; - à la place de
%dextrayez unintet affichez-le ; - à la place de
%%affichez un%.
La fonction renvoie le nombre d’octets qu’elle a réussi à écrire.