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.

Synopsis
#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

lire.c
#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;}
Terminal
$ 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ù scanf attend 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.

  • %s sans largeur peut écrire au-delà du tableau. Donne toujours une limite : scanf("%19s", nom) pour un char nom[20].

  • %c lit 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, fgets est plus sûr que scanf.

C

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.

Ouvrir l'exercice

À toi d'écrire le code.