Pourquoi dans une boucle, scanf () avec% d n’attend pas l’entrée utilisateur au cas où il aurait reçu une entrée invalide auparavant?

J’utilise ce que scanf() returns when it gets what is expects or when it doesn't. What happens is it gets stuck in the scanf() returns when it gets what is expects or when it doesn't. What happens is it gets stuck in the boucle while () `.

À ma connaissance test = scanf("%d", &testNum); renvoie un 1 s’il reçoit un nombre et un 0 sinon.

Mon code:

 #include int main(void) { while (1) { int testNum = 0; int test; printf("enter input"); test = scanf("%d", &testNum); printf("%d", test); if (test == 0) { printf("please enter a number"); testNum = 0; } else { printf("%d", testNum); } } return(0); } 

Le problème ici est que, lorsqu’une entrée non valide est trouvée (un caractère, par exemple), l’entrée incorrecte n’est pas consommée , elle rest dans le tampon d’entrée.

Ainsi, dans la boucle suivante, la même entrée non valide est à nouveau lue par scanf() .

Vous devez nettoyer le tampon après avoir identifié une entrée incorrecte. Une approche très simple sera,

  if (test == 0) { printf("please enter a number"); while (getchar() != '\n'); // clear the input buffer off invalid input testNum = 0; } 

Cela dit, initialisez le test ou supprimez printf("%d", test); , comme test étant une variable automatique, à moins d’être initialisée explicitement, contient une valeur indéterminée. Essayer d’utiliser cela peut invoquer un comportement indéfini .

Cela dit, pour ne rien dire, le return n’est pas une fonction, ne le faites pas ressembler. C’est un état, alors return 0; est beaucoup plus apaisant pour les yeux et beaucoup moins déroutant, de toute façon.