Je crois que vous ne devriez jamais appeler fflush(stdin)
, et pour la simple raison que vous ne devriez même pas trouver nécessaire d'essayer de vider l'entrée en premier lieu. En réalité, il n'y a qu'une seule raison pour laquelle vous pourriez penser que vous deviez vider l'entrée, et c'est : pour contourner une mauvaise saisie sur laquelle scanf
est bloqué.
Par exemple, vous pourriez avoir un programme qui se trouve dans une boucle lisant des entiers en utilisant scanf("%d", &n)
. Assez vite, vous découvrirez que la première fois que l'utilisateur tape un caractère non numérique comme 'x'
, le programme entre dans une boucle infinie.
Face à cette situation, je pense que vous avez essentiellement trois choix :
- Vider l'entrée de quelque manière que ce soit (si ce n'est pas en utilisant
fflush(stdin)
, alors en appelant getchar
dans une boucle pour lire des caractères jusqu'à \n
, comme cela est souvent recommandé).
- Dire à l'utilisateur de ne pas taper de caractères non numériques lorsque des chiffres sont attendus.
- Utiliser quelque chose d'autre que
scanf
pour lire l'entrée.
Maintenant, si vous êtes débutant, scanf
semble être le moyen le plus simple de lire l'entrée, et donc le choix n°3 semble effrayant et difficile. Mais le n°2 semble être un moyen facile, car tout le monde sait que les programmes informatiques peu conviviaux sont un problème, donc ce serait bien de faire mieux. Ainsi, beaucoup trop de programmeurs débutants se retrouvent coincés, sentant qu'ils n'ont d'autre choix que de faire n°1. Ils doivent plus ou moins saisir l'entrée en utilisant scanf
, ce qui signifie qu'elle restera bloquée sur une mauvaise saisie, ce qui signifie qu'ils doivent trouver un moyen de vider la mauvaise saisie, ce qui les incite fortement à utiliser fflush(stdin)
.
J'aimerais encourager tous les débutants en programmation C là-bas à faire un ensemble différent de compromis :
-
Pendant les premières étapes de votre carrière en programmation C, avant d'être à l'aise avec tout autre chose que scanf
, ne vous préoccupez simplement pas de la mauvaise saisie. Vraiment. Allez-y et utilisez le moyen facile n°2 ci-dessus. Pensez-y de cette manière : vous êtes débutant, il y a beaucoup de choses que vous ne savez pas encore faire, et l'une des choses que vous ne savez pas encore faire est : faire face gracieusement à une saisie inattendue.
-
Dès que vous le pouvez, apprenez à saisir l'entrée en utilisant des fonctions autres que scanf
. À ce moment-là, vous pouvez commencer à traiter de manière élégante la mauvaise saisie, et vous disposerez de nombreuses autres techniques bien meilleures qui ne nécessiteront pas d'essayer de "vider la mauvaise saisie" du tout.
Ou, en d'autres termes, les débutants qui sont toujours coincés en utilisant scanf
devraient se sentir libres d'utiliser le moyen facile n°2, et quand ils seront prêts, ils devraient passer de là à la technique n°3, et personne ne devrait utiliser la technique n°1 pour essayer de vider l'entrée du tout -- et certainement pas avec fflush(stdin)
.