IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

test d'erreur avec 'scanf' et affichage de l'erreur (cas d'école)


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 8
    Par défaut test d'erreur avec 'scanf' et affichage de l'erreur (cas d'école)
    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+

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Qu'en penses-tu toi-même?
    Qu'est-ce qui te parait modifiable?

    Le code est commenté, c'est bien.

    Par contre, il y a un gros soucis cosmétique: si tu dois commenter la déclaration de chaque variable, c'est qu'elles sont mal nommées.
    On peut avoir des commentaires de groupe de variable (lecture, fichier, calcul...).

    Tu reconnaitras que n, c, j sont des noms moins clairs que statut, controle et nb_erreurs.

    envisage l'énumération plutôt que les constantes macros:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    enum affichage_t {DEJAAFFICHER = 0, AAFFICHER};
    Par ailleurs, comme tous les débutants, tu utilises scanf pour les saisies utilisateurs, ce qui n'est pas l'usage prévu de la fonction.
    On a eu cette discussion récemment: Plus ou moins.exe a cessé de fonctionner

    Ps: je n'ai pas regardé la logique du code.

  3. #3
    Membre habitué
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 8
    Par défaut
    Merci pour cette première analyse. :-)

    Si tu as le temps, peux-tu regarder le code?

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 814
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par p.salvador Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	printf("Saisir une valeur entière : ");
    	n = scanf("%d", &val);
    	
    	while(n != 1)
    	{
    		... plein de trucs...		
    		scanf("%c", &c); /*permet à la première boucle while de s'arrêter et de ne pas partire en boucle infinie.*/
    		// T'es sûr ??? Si n n'est pas modifié dans la boucle ça part quand-même en boucle infinie !!!
    	}
    Bon, faire une première saisie avant la boucle puis une saisie en fin de boucle ça fait très "bon élève qui a bien écouté le professeur" mais l'avantage du C c'est qu'il peut à la fois affecter et tester l'affectation.
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while ((n=scanf("%c", &c)) != 1)
    	{
    		... plein de trucs mais pas de boucle infinie malgré une unique saisie
    	}
    Et j'ai mis une remarque en rouge dans ton code concernant ta façon d'éviter la boucle infinie...

    Citation Envoyé par p.salvador Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    /*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. */
    Exact. Tant que tout ce qui est dans le clavier et qui n'est pas du nombre n'est pas éliminé, scanf() les purge un à un.
    Solution: faire une saisie mode texte via fgets() (le clavier reste clean) puis récupérer et analyser la saisie via sscanf()
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char saisie[100];
    int c;
     
    fgets(saisie, 100, stdin);			// Ici le clavier est entièrement purgé (s'il y a moins de 100 caractères bien sûr !!!)
    if (sscanf(saisie, "%d", &c) == 1)		// Les données de "saisie" sont traitées et si c'est du nombre alors ça va dans "c"
    	printf("saisie nombre %d ok\n", c);
    else
    	printf("Erreur, [%s] n'est pas un nombre valide\n", saisie);

    Sinon tout tes trucs avec i et test avec AAFFICHER et DEJAAFFICHE (avec un participe passé c'est mieux) j'ai rien pigé. Je devine que tu tentes un truc pour savoir si c'est déjà entré dans la boucle mais ça vire "usine à gaz"...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre habitué
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 8
    Par défaut
    Super... Meric!!

Discussions similaires

  1. Affichage message d'erreur avec struts 2 et freemarker
    Par Cincinnatus dans le forum Struts 2
    Réponses: 6
    Dernier message: 15/05/2009, 09h29
  2. erreur avec affichage l'heure
    Par ulysse031 dans le forum Langage
    Réponses: 4
    Dernier message: 24/03/2007, 12h12
  3. message d'erreur avec l'affichage
    Par ulysse031 dans le forum Langage
    Réponses: 12
    Dernier message: 15/03/2007, 16h33
  4. erreurs avec asp.net affichage web
    Par dorian2031 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 14/02/2007, 11h09
  5. Test sur formulaire avec liste des erreurs
    Par Nicos77 dans le forum Langage
    Réponses: 37
    Dernier message: 17/11/2005, 10h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo