Quelle est l'utilisation de fflush(stdin) dans la programmation de c [fermé]

j'ai le programme suivant

#include <stdio.h>
#include <stdlib.h>

int main()
{
   char ans[8];
    int i;
    for(i=1;i<=3;i++)
    {
        printf("n What is the unit of traffic ?");
        scanf("%s",ans);
        fflush(stdin);

        if(stricmp(ans,"Earlang")==0)
        {
            printf("nAnswer is correct");
            exit(1);
        }
        else
            if(i<3)
            printf("n Try Again!n");
    }
    printf("n Nunit of traffic is Earlang:");
}

Quelle est l'utilisation de fflush(stdin) dans ce programme?

17
c
demandé sur gsamaras 2013-08-11 13:10:48

3 réponses

ce n'est pas dans la norme C, donc le comportement n'est pas défini.

certaines implémentations l'utilisent pour effacer le tampon stdin .

De l'C11 7.21.5.2 La fonction fflush , fflush fonctionne uniquement avec sortie/mise à jour de flux, pas de flux d'entrée.

si stream pointe vers un flux de sortie ou un flux de mise à jour dans lequel le plus récent opération n'a pas été entrée, la fonction fflush causes toute donnée non écrite pour ce flux à être livrés à l'environnement hôte à être écrite dans le fichier; sinon, le comportement est indéterminé.

21
répondu Yu Hao 2013-08-11 09:12:57

il efface stdin tampon avant de lire. De l'homme page :

Pour les flux de sortie, fflush() force l'écriture de tous les utilisateurs de l'espace-tampon données pour le flux de sortie ou de mise à jour donné via le flux sous-jacent la fonction d'écriture. pour les flux d'entrée, fflush () rejette toute donnée tamponnée qui a été extraite à partir du fichier sous-jacent, mais n'a pas été consommée par l'application.

Note: Ceci est spécifique à Linux, utiliser fflush() sur les flux d'entrée n'est pas défini par la norme, cependant, la plupart des implémentations se comportent de la même façon que sous Linux.

10
répondu iabdalkader 2013-10-16 12:47:20

il s'agit d'une façon peu fiable de supprimer toutes les données du tampon d'entrée jusqu'à la nouvelle ligne suivante. Je l'ai vu utilisé dans des cas comme celui-ci:

char c;
char s[32];
puts("Type a char");
c=getchar();
fflush(stdin);
puts("Type a string");
fgets(s,32,stdin);

sans le fflush() , si vous tapez un caractère, dites" a", et que la touche Entrée, le tampon d'entrée contient" A\n", le getchar() regarde le" A", mais le" \N "reste dans le tampon, donc le prochain fgets() le trouvera et retournera une chaîne vide sans même attendre l'entrée de l'utilisateur.

Cependant, notez que cette utilisation de fflush() est impropre. J'ai testé en ce moment sur une machine Linux, et ça ne fonctionne pas, par exemple.

5
répondu user2671945 2013-08-11 09:22:02