Pourquoi scanf () n’attend-il pas l’entrée du clavier?

J’ai ci-dessous le code C.

#include int main() { //Declaring structure book. struct book { char name; float price; int pages; }; struct book b[5]; int i; //Below loop takes the info if 5 books from user for (i=0; i<5; i++) { printf("Enter name, price, and pages: "); fflush( stdin ); scanf("%c%f%d",&b[i].name,&b[i].price,&b[i].pages); } return 0; } 

Cependant, lorsque je comstack et que je cours, quelque chose d’étrange se produit.

 -bash-4.1$ ./a.out Enter name, price, and pages: A 23 34 Enter name, price, and pages: B 34 54 Enter name, price, and pages: Enter name, price, and pages: C 56 78 Enter name, price, and pages: -bash-4.1$ 

Vous pouvez voir que lorsque i = 2, scanf () n’attend pas le clavier. Ensuite, lorsque i = 3, scanf () attend l’entrée au clavier. Toujours dans i = 4, scanf () n’attend pas l’entrée au clavier.

Je suppose que j’ai utilisé

 fflush(stdin); 

au bon endroit. Je ne veux pas que la clé de retour soit dans la mémoire tampon dans le prochain scanf ().

Pour déboguer, j’ai essayé de ne pas utiliser fflush (stdin) et de voir ce qu’il faisait. Mais même sans le fflush (stdin), la même chose se produit lorsque je lance le programme. Donc, je suppose que fflush (stdin) ne cause pas ce problème.

S’il vous plaît, faites-le savoir, où mon programme va mal?

Merci.

    La norme C11 explique comment %c fonctionne:

    §7.21.6.2 / 8 Les caractères d’espacement des blancs d’entrée (tels que spécifiés par la fonction isspace ) sont ignorés, sauf si la spécification inclut un spécificateur [ , c ou n .

    Ainsi, le saut de ligne produit par la touche entrée est consommé par% c. Vous pouvez résoudre ce problème en ajoutant un espace avant %c :

    §7.21.6.2 / 5 Une directive composée de caractère (s) d’espace-blanc est exécutée en lisant l’entrée jusqu’au premier caractère sans espace (qui rest non lu) ou jusqu’à ce qu’il ne soit plus possible de lire des caractères. La directive n’échoue jamais.

    Votre code devient scanf(" %c%f%d",&b[i].name,&b[i].price,&b[i].pages); .


    Notez que fflush ne doit pas être utilisé ici.

    §7.21.5.2 / 2 Si le stream pointe vers 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 et à l’environnement hôte ; sinon, le comportement n’est pas défini.