Scanf et boucles

voici un morceau de code qui est censé en boucle jusqu'à ce que les entrées de l'utilisateur un nombre compris entre 0 et 15

        int input;

        do
        {

                printf("Enter a number => ");
                scanf("%d",&input);
                printf("\n %d \n",input);

        }
        while (!(input>0 && input <15));

Toutefois, si l'utilisateur met dans quelque chose comme "gfggdf" qu'il résulte de la boucle répéter plus et plus et plus et de ne jamais demander à l'utilisateur pour la saisie de nouveau... la console ressemble à ceci

Enter a number =>
0
Enter a number =>
0
Enter a number =>
0
Enter a number =>
0
Enter a number =>
0
Enter a number =>
0
(looping indefinitely)

Après en regardant à travers ce livre, il semble que j'ai besoin de faire quelque chose comme cela pour empêcher que cela se produise.

int input, error, status;
char skip_ch;

do
{
        error = 0;

        printf("Enter a number => ");
        status = scanf("%d",&input);
        printf("\n %d \n",input);

        if(status!=1)
        {
                error=1;
        }
        else if(input < 0 || input >15){
                error = 1;
        }

        do
        {
                scanf("%c",&skip_ch);
        }while(skip_ch != '\n');
}
while (error);

Je comprends d'avoir à vérifier pour le scanf état pour s'assurer qu'il est valide d'entrée, Ce que je ne comprends pas la l'intérieur do-while. Je crois que le livre n'a jamais vraiment expliqué moi pourquoi scanf doit être appelée plusieurs fois comme ça, c'est comme en quelque sorte le scanf de la mémoire tampon s'est rempli avec un tas d'ordures et c'est en quelque sorte le nettoyage par bouclage par le biais d'un million de fois pour vous.

Quelqu'un pourrait-il m'expliquer pourquoi la magie noire pour moi?

Le livre est de 25% à droite. TOUJOURS VÉRIFIER LES VALEURS de RETOUR DES FONCTIONS d'ENTRÉE. Le dernier scanf peut entrer dans une boucle infinie si il y a une erreur de lecture (mauvais secteur, des médias supprimés, ...) ou le fichier se termine avant un '\n'

OriginalL'auteur Danny | 2010-10-04