Bonjour,
M'amusant à coder, je me suis lancé dans un projet de "calculatrice" appconsole. J'aimerais vérifier les entrées, ce qui fait qu'en tournant sur internet, je suis tombé sur ça:
J'en avais déjà entendu parlé, mais le problème est que tu tombes sur une boucle infinie, si tu n'entres pas la bonne valeur (ex: "a"). Une personne a corrigé ce problème de boucle infinie dans le code suivant, mais je ne comprend pas bien la deuxième boucle "while".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 int status, input; status = scanf("%d", &input); while(status!=1){ printf("Incorrect number... please try again: "); status = scanf("%d", &input); }
Si je ne trompe pas, la deuxième boucle "while" va s'exécuter tant que caractère contenu dans "temp" est différent de "end of file" et d'un "retour à la ligne". Cette boucle "While" ne comprend que "printf", si je me trompe pas? Mais en quoi ça va changer/résoudre le problème? Est-ce lié à une différence dans la manière les entiers et les caractères sont stockés dans la mémoire?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 #include<stdio.h> int main(void){ // input user input -- hopefully a number // temp used to collect garbage characters // status did the user enter a number? int input, temp, status; printf("Please enter a number: "); status = scanf("%d", &input); while(status!=1){ while((temp=getchar()) != EOF && temp != '\n'); printf("Invalid input... please enter a number: "); status = scanf("%d", &input); } printf("Your number is %d\n",input); return 0; }
Cas théorique:
- je rentre "1" et appuie sur "entré". Étant une variable "entier", je présume quelle ne stocke pas "\n" quand j'appuie sur "entré", ce qui fait que la fonction "scanf" renvoie "1' qui est stocké dans "status". De là, les deux boucles suivantes ne s'exécutent pas et le programme s'arrête.
- je rentre "10" et appuie sur "entré". Etant une variable "entier", je présume quelle ne stocke pas "\n" quand j'appuie sur "entré", ce qui fait que la fonction "scanf" renvoie "2" (??) qui est stocké dans "status". De là, mes deux boucles "while" ne sont-elles pas censé s'exécuter pour me renvoyer un message d'erreur? Comment ça se fait que je ne reçois pas de message d'erreur? l'entier "10" est traité comme un seul caractère?
- je rentre "a" et appuie sur "entré". Etant une variable "character", je présume quelle stocke "\n" quand j'appuie sur "entré", ce qui fait que la fonction "scanf" renvoie "2" (??) qui est stocké dans "status". De là, mes deux boucles "while" s'active et me renvoient le message d'erreur. Mais comment ça se fait que je tombe pas dans une boucle infinie?
Merci d'avance pour votre aide,
Red'
Partager