scanf(3)
Fonction de la bibliothèque C
Lit l'entrée standard selon un format et range les valeurs aux adresses données. Renvoie le nombre de valeurs lues, à tester à chaque appel.
#include <stdio.h>
int scanf(const char *restrict format, ...);Description
scanf lit des caractères sur l'entrée standard et les convertit selon le format : %d pour un int, %lf pour un double, %s pour un mot, %c pour un caractère. Chaque conversion range sa valeur à une adresse, d'où le & devant les variables : scanf("%d", &age). Pour %s, un tableau de char se passe sans &, puisque son nom désigne déjà son adresse.
Valeur de retour
Le nombre de conversions réussies et rangées. Elle vaut EOF si l'entrée se termine avant la première conversion. Une saisie qui ne correspond pas au format renvoie un nombre plus petit que prévu, et les caractères fautifs restent dans le tampon d'entrée.
Exemple
#include <stdio.h>
int main(void){ int age;
printf("Ton âge : "); if (scanf("%d", &age) != 1) { printf("\nCe n'est pas un nombre.\n"); return 1; } printf("Tu as %d ans.\n", age); return 0;}$ gcc -Wall -Wextra -g lire.c -o lire$ echo 19 | ./lireTon âge : Tu as 19 ans.$ echo dix-neuf | ./lireTon âge : Ce n'est pas un nombre.Pièges
Oublier le
&passe une valeur là oùscanfattend une adresse. GCC prévient avec-Wall(expects argument of type 'int *'), et le programme plante souvent.Ne pas tester la valeur de retour laisse la variable non initialisée quand la saisie est invalide.
%ssans largeur peut écrire au-delà du tableau. Donne toujours une limite :scanf("%19s", nom)pour unchar nom[20].%clit aussi les espaces et le retour à la ligne laissé par la saisie précédente. Un espace dans le format," %c", les saute.Pour lire une ligne entière,
fgetsest plus sûr quescanf.
mini_scanf
Écris mini_scanf, une version réduite de scanf qui gère %d, %s et %c, et renvoie le nombre de conversions réussies.