web-dev-qa-db-fra.com

Détection EOF en C

J'utilise le code C suivant pour prendre l'entrée de l'utilisateur jusqu'à ce que EOF se produit, mais le problème est que ce code ne fonctionne pas, il se termine après avoir pris la première entrée. Quelqu'un peut-il me dire ce qui ne va pas avec ce code . Merci d'avance.

float input;

printf("Input No: ");
scanf("%f", &input);

while(!EOF)
{
    printf("Output: %f", input);
    printf("Input No: ");
    scanf("%f", &input);
}
25
itsaboutcode

EOF n'est qu'une macro avec une valeur (généralement -1). Vous devez tester quelque chose par rapport à EOF, comme le résultat d'un appel à getchar().

Une façon de tester la fin d'un flux consiste à utiliser la fonction feof.

if (feof(stdin))

Notez que l'état de "fin de flux" ne sera défini que après une lecture a échoué.

Dans votre exemple, vous devriez probablement vérifier la valeur de retour de scanf et si cela indique qu'aucun champ n'a été lu, vérifiez la fin du fichier.

42
CB Bailey

EOF est une constante en C. Vous ne vérifiez pas le fichier réel pour EOF. Vous devez faire quelque chose comme ça

while(!feof(stdin))

Voici la documentation pour feof . Vous pouvez également vérifier la valeur de retour de scanf . Il renvoie le nombre d'éléments convertis avec succès, ou EOF s'il atteint la fin du fichier.

9
A. Levy

Un autre problème est que vous lisez uniquement avec scanf("%f", &input);. 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'affectera rien à input et ne progressera pas De là. Cela signifie qu'il essaierait de continuer à lire "pi" et échouerait.

Étant donné la modification de while(!feof(stdin)) que les autres affiches recommandent correctement, si vous tapiez "pi", il y aurait une boucle sans fin pour imprimer l'ancienne valeur de input et imprimer l'invite, mais le programme ne traiterait jamais aucune nouvelle entrée.

scanf() renvoie le nombre d'affectations aux variables d'entrée qu'il a 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 nul de la chaîne).

Vous savez, cela me rappelle toutes les raisons pour lesquelles je déteste scanf(), et pourquoi j'utilise à la place fgets() et peut-être ensuite l'analyser en utilisant sscanf().

4
David Thornley