fflush ne fonctionne pas

Pourquoi fflush(..) ne fonctionne pas avec c2 et c0 ?
Si j’utilise la déclaration c0 = 0 et c2 = 0 cela fonctionne, mais fflush(stdin) ne fonctionne pas, j’ai essayé de le mettre à différents endroits mais cela n’a pas fonctionné, im utilisant des blocs de code dans Ubuntu 13.04;

 int main(void) { int cod ,passou = 0, c0, c1, c2, c3, ct; float p1, p2, p3; char o; do { puts ("Informe codigo: "); scanf ("%i", &cod); fflush (stdin); switch (cod) { case 0: c0 = c0 + 1; break; case 1: c1 = c1 + 1; ct = ct + 1; break; case 2: c2 = c2 + 1; ct = ct + 1; break; case 3: c3 = c3 + 1; ct = ct + 1; break; default: puts ("Valor invalido"); } getchar(); puts ("Deseja informar mais um voto?"); fflush (stdin); scanf("%c",&o); if (o == 'S' || o == 's' ) { passou = 0; } else if (o == 'N' || o == 'n' ) { passou = 1; } else { puts ("Opcao invalida"); } } while ( passou != 1 ); p1=(c1/ct)*100; p2=(c2/ct)*100; p3=(c3/ct)*100; if (c1 > c2 && c1 > c3 && c1 > c0 ) { puts ("Candidato numero 1 eh o vencedor"); } else if (c2 > c1 && c2 > c3 && c3 > c0) { puts ("Candidato numero 2 eh o vencedor"); } else if (c3 > c1 && c3 > c2 && c3 > c0) { puts ("Candidato numero 3 eh o vencedor"); } else { puts ("Numero de votos em branco eh maior do que todos os outros candidatos"); } printf ("\nTotal de votos do candidato 1: %d", c1); printf ("\nTotal de votos do candidato 2: %d", c2); printf ("\nTotal de votos do candidato 3: %d", c3); printf ("\nTotal de votos em branco: %d", c0); printf ("\nPercentual de votos do candidato 1: %.2f", p1); printf ("\nPercentual de votos do candidato 2: %.2f", p2); printf ("\nPercentual de votos do candidato 3: %.2f", p3); return 1; } 

    fflush(stdin) a un comportement indéfini. Utilisez cette option pour traiter la nouvelle ligne qui rest dans la mémoire tampon stdin lors de l’utilisation de scanf() , en particulier dans les cas où vous avez besoin de lire un caractère alors que la nouvelle ligne restant dans la mémoire tampon est automatiquement utilisée. le personnage :

      while((c = getchar()) != '\n' && c != EOF); 

    Voici ce que cplusplusreference dit à propos de fflush() (vous pouvez également vérifier la même chose d’autres sources, car trop d’anciens combattants sont tellement cplusplusreference sourcils cplusplusreference lorsque cplusplusreference est cplusplusreference bien qu’ils ne parviennent pas à le condamner complètement)

    ......In some implementations, flushing a stream open for reading causes its input buffer to be cleared (but this is not portable expected behavior).....

    http://www.cplusplus.com/reference/cstdio/fflush/

    Sur votre système, Ubuntu 13.04 (Unix ou Linux) appelle fflush (stdin); est un comportement indéfini!

    int fflush(FILE *ostream);

    ostream pointe sur un stream de sortie ou un stream de mise à jour dans lequel l’opération la plus récente n’a pas été entrée. La fonction fflush provoque l’écriture dans le fichier des données non écrites relatives à ce stream. sinon, le comportement n’est pas défini

    Pour apprendre une astuce pour vider le tampon d’entrée correctement, vous pouvez utiliser certains des extraits de code suivants qui lisent et suppriment les caractères indésirables de la mémoire tampon d’entrée. Vous pouvez utiliser ceci comme fflush avant de lire les données réelles. lisez cette entrée de la FAQ.

    pour C :

      while ((ch = getchar()) != '\n' && ch != EOF); 

    pour C ++ :

      while ((ch = cin.get()) != '\n' && ch != EOF); 

    Cependant, si vous appelez ces derniers lorsqu’il n’y a pas de données dans le stream d’entrée, le programme attendra jusqu’à ce qu’il y en ait, ce qui vous donnera des résultats indésirables.

    Lire: @ Réponse de Keith Thompson : “Alternative à la fonction de bibliothèque C fflush(stdin)

    Modifier:
    Il existe des plates-formes où fflush(stdin) est entièrement défini (en tant qu’extension non standard sur cette plate-forme). L’exemple principal est une famille de systèmes bien connue connue sous le nom de Windows. Spécification Microsoft:

    Rince un ruisseau

    La fonction int fflush(FILE *stream ) vide un stream. Si le fichier associé à stream est ouvert pour la sortie, fflush écrit dans ce fichier le contenu de la mémoire tampon associée au stream. Si le stream est ouvert à l’ input , fflush efface le contenu de la mémoire tampon. fflush annule l’effet de tout appel précédent visant à annuler l’enregistrement de stream. De plus, fflush(NULL) vide tous les stream ouverts pour la sortie. Le stream rest ouvert après l’appel. fflush n’a aucun effet sur un stream non tamponné.