Une autre question est que vous lisez avec scanf("%f", &input);
seulement. Si l'utilisateur tape quelque chose qui ne peut pas être interprété comme un nombre à virgule flottante C, comme "pi", l'appel scanf()
n'attribuera rien à input
, et ne progressera pas à partir de là. Cela signifie qu'il tenterait de continuer à lire "pi" et d'échouer. Étant donné le changement à while(!feof(stdin))
que d'autres affiches recommandent correctement, si vous avez tapé "pi" il y aurait une boucle sans fin d'imprimer l'ancienne valeur de input
et l'impression de l'invite, mais le programme ne traiterait jamais de nouveau contribution.
scanf()
renvoie le nombre d'affectations aux variables d'entrée effectuées. S'il n'a fait aucune affectation, cela signifie qu'il n'a pas trouvé de nombre à virgule flottante, et vous devriez lire plus d'entrées avec quelque chose comme char string[100];scanf("%99s", string);
. Cela supprimera la chaîne suivante du flux d'entrée (jusqu'à 99 caractères, de toute façon - le char
supplémentaire est pour le terminateur null sur la chaîne).
Vous savez, cela me rappelle toutes les raisons que je déteste scanf()
, et pourquoi j'utilise fgets()
à la place, puis peut-être l'analyser en utilisant sscanf()
.
Note: En supposant que l'entrée utilisateur n'est pas canalisé, la vérification de EOF est probablement pas idéal, car IIRC généralement cela signifie que l'utilisateur doit appuyer sur Ctrl + D pour arrêter de fumer, ce qui n'est pas évident – Brian