Bonjour à toutes et à tous,

Je n'ai pas l'habitude de venir sur le forum, alors je m'excuse si je fais des éventuelles erreurs!

J'ai un cas d'école à vous soumettre et je vous demande si vous pouvez commenter ce qui suis:

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
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
 
#include <stdio.h>
#include <stdlib.h>
 
#define AAFFICHER 1 /* Afficher l'erreur */
#define DEJAAFFICHER 0 /* L'affichage a déjà était fait*/
 
int main()
{
	int n; //var permettant de recevoir l'erreur, ou pas, de scanf
	char c; //var permettant à la boucle while de s'arrêter
	int val = 0;
	int j = 0; //Compteur du nombre d'erreur (de caractère introduit par erreur.)
	int test = AAFFICHER; //test qui permet d'indiquer si on a déjà affiché une première fois l'erreur.
 
	printf("Saisir une valeur entière : ");
	n = scanf("%d", &val);
 
	while(n != 1)
	{
		/*Le problème ici est, à chaque fois qu'une suite de caractère est introduite par erreur,
		la boucle refait un cycle en affichant le 'printf' ci-dessous pour chaque caractère et non pour la suite de caractère.
		*/
		if(test == AAFFICHER) //test qui permet d'indiquer si on a déjà afficher une première fois.
		{
			printf("\n\nErreur!\n\n");
			printf("Saisir une valeur entière : ");
 
			test = DEJAAFFICHER; //On a déjà afficher une première fois
			j = DEJAAFFICHER; /*remise à zéro pour permettre l'affichage en cas de reintroduction d'une suite
			de caractères erronés à la suite d'une première introduction.*/
		}
 
		scanf("%c", &c); /*permet à la première boucle while de s'arrêter et de ne pas 
		partire en boucle infinie.*/
 
		/*2ème boucle while:
		Tant qu'il y a une suite de caractères qui ne correspondent pas à une valeur 'int', j++.
		Si j = 0, cela veut dire que l'on rentre dans un nouveau cycle d'erreur (suite de caractère) 
		et donc il faut réafficher le 'printf' et donc, test = 1.
		Sinon, ne pas réafficher.
 
		En fait, cela permet de savoir si l'on a ou pas affichier une fois le 'printf' et si 
		c'est le cas de ne pas le réafficher à moins que l'on introduise de nouveau une suite 
		de caractère erroné.
		*/
		while(c != '\n')
		{
			scanf("%c", &c);
			if(j == AAFFICHER)
				test = AAFFICHER;
			j++;
		}
 
		n = scanf("%d", &val);
	}
 
	printf("val = %d\n", val);
 
    return 0;
}
Ce code est testé sous MacOSX avec le Terminal et compilé avec gcc

A+