La fonction scanf permet de lire des données au clavier, mais elle doit être utilisée avec soin : elle comporte plusieurs pièges (espaces, restants, dépassements…). Ce chapitre t’explique comment l’utiliser correctement et comment vider le buffer lorsque c’est nécessaire.
À la fin de ce cours, tu sauras :
scanf pour lire les principaux types ;& ;%d, %f, %s, …) ;fgets quand c’est plus fiable.int age;
scanf("%d", &age);
float moyenne;
scanf("%f", &moyenne);
char lettre;
scanf(" %c", &lettre);
💡 L’espace avant %c permet d’ignorer le \n restant dans le buffer.
char[])char nom[30];
scanf("%s", nom);
⚠️ %s s'arrête au premier espace.
fgetsfgets(nom, sizeof(nom), stdin);
scanf&❌ scanf("%d", age);
✔️ scanf("%d", &age);
%s❌ scanf("%s", nom);
✔️ scanf("%29s", nom);
%c lit les retours à la ligne✔️ scanf(" %c", &lettre);
Ne jamais faire :
scanf("%f", &x);
scanf("%d", &monFloat);
scanf ne vide jamais le bufferSi tu tapes :
25⏎
→ 25 est lu
→ ⏎ reste en mémoire
→ la prochaine lecture peut capter ce \n
C'est une source majeure de bugs.
Il existe plusieurs techniques selon la situation. Voici les 3 méthodes fiables à enseigner.
\nint c;
while ((c = getchar()) != '\n' && c != EOF) {
// on vide
}
Cette méthode :
\n,👉 C’est la méthode classique et recommandée en C.
fflush(stdin) (⚠️ non standard)fflush(stdin);
⚠️ Important :
👉 À éviter pour un cours strictement ISO C. Mais utile à connaître si tu compiles sous Windows.
Utile après une lecture incorrecte :
char tampon[100];
fgets(tampon, sizeof(tampon), stdin);
Cela vide proprement toute la ligne restante.
scanf("%d") ou scanf("%f") si tu comptes lire un char juste après.fgets, si un scanf a été utilisé juste avant.| Type | Format |
|---|---|
int |
%d |
float |
%f |
double |
%lf |
char |
" %c" |
| chaîne simple | %s |
| chaîne limitée | %20s |
scanf avec plusieurs valeursint a, b;
scanf("%d %d", &a, &b);
if (scanf("%d", &x) != 1) {
printf("Erreur de saisie\n");
}
fgets()sscanf()strtol() ou strtof()scanf lit dans tes variables → & obligatoire sauf pour les tableaux.%s est dangereux : le limiter ("%29s") ou utiliser fgets.%c doit presque toujours avoir un espace devant.while (getchar() != '\n');