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:

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);
}
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
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;
}
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?

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'