Je ne comprends pas pourquoi il en est une boucle infinie, écrire « Donner une intiger » sur la console
Le problème est que scanf()
ne consomme pas les données qu'il ne peut pas correspondre contre le format spécifié. Il laisse ces caractères non lus dans le flux d'entrée. Par conséquent, si vous essayez de lire à nouveau à partir du même flux avec le même format, sans consommer au moins un caractère par un autre moyen, vous pouvez être certain que l'entrée ne correspondra pas à nouveau. Et encore. Et encore. Pour éviter votre boucle infinie, vous devez consommer au moins un caractère de l'entrée non correspondante après chaque échec de correspondance. Il y a plusieurs façons de le faire. voici une assez simple:
#include <stdio.h>
int main() {
int a;
do {
printf("Give an intiger\n");
if (scanf("%d", &a)) {
// breaks from the loop on a successful match or an error
break;
}
// consume the remainder of one line of input without storing it
if (scanf("%*[^\n]") == EOF) {
break;
}
} while (1);
}
qui consomme tout le reste de la ligne sur laquelle l'entrée non-appariement est rencontré, ce qui donnera un comportement interactif moins surprenant pour certaines entrées que de nombreuses solutions ne.
Si vous avez un penchant pour l'écriture de code laconique, ou si vous ne l'aimez pas break
hors du milieu d'une boucle, vous pouvez écrire la même chose comme ceci:
#include <stdio.h>
int main() {
int a;
do {
printf("Give an intiger\n");
} while ((scanf("%d", &a) == 0) && (scanf("%*[^\n]") != EOF));
}
Parce que les &&
courts-circuits de l'opérateur, le second appel scanf()
sera exécuté uniquement si le premier renvoie zéro, et la boucle sortira après la première itération dans laquelle le premier scanf()
appel renvoie non nul ou le second renvoie EOF
(indiquant une erreur).
[Les intigers sont des choses merveilleuses!] (Https://www.youtube.com/watch?v=dJFyz73MRcg) – user4581301
Le problème est que 'scanf()' ne consomme pas les données qui ne correspondent pas à votre descripteur de champ. Par conséquent, lorsque vous effectuez une nouvelle tentative pour réessayer, les mêmes données non correspondantes sont toujours en attente de traitement. –
Ça marche! Mais je ne comprends pas vraiment pourquoi :)) –