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 :

Problème avec un switch !


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 25
    Par défaut Problème avec un switch !
    Voici le bout de code qui pose problème :


    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
    62
    63
    		codeLu = getchar();
    		while(codeLu != '0')
    		{
    			switch(codeLu)
    			{
    			case '1':
    				{
    					printf("\nRentrez le nouveau prenom : ");
    					fflush(stdin);
    					gets(prenomLu);
    					for(k=0; k<j; k=k+1)
    					{
    						if((strcmp(Tab[i].nom, Tab[k].nom) == 0))
    						{
    							if((strcmp(Tab[k].prenom, prenomLu) == 0))
    								break;
    						}
    					}
     
    					if(k<j)
    						printf("\nModification rejetee : la personne existe deja.\n");
    					else
    						strcpy(Tab[i].prenom, prenomLu);
    					printf("\nSi vous souhaitez effectuer une autre modification, rentrez 1, 2 ou 3, sinon rentrez 0 pour quitter.\n");
    					codeLu = getchar();
    					if(codeLu == '0')
    						printf("\nAffichage des nouvelles informations concernant la personne :\n\n\t%-25s %-25s %-15s %-10s\n\n", Tab[i].nom, Tab[i].prenom, Tab[i].tel, Tab[i].codeCat);
    					break;
    				}
    			case '2':
    				{
    					printf("\nRentrez le nouveau telephone : ");
    					fflush(stdin);
    					gets(telLu);
    					strcpy(Tab[i].tel, telLu);
    					printf("\nSi vous souhaitez effectuer une autre modification, rentrez 1, 2 ou 3, sinon rentrez 0 pour quitter.\n");
    					codeLu = getchar();
    					if(codeLu == '0')
    						printf("\nAffichage des nouvelles informations concernant la personne :\n\n\t%-25s %-25s %-15s %-10s\n\n", Tab[i].nom, Tab[i].prenom, Tab[i].tel, Tab[i].codeCat);
    					break;
    				}
    			case '3':
    				{
    					printf("\nRentrez la nouvelle categorie : ");
    					fflush(stdin);
    					gets(codeCatLu);
    					strcpy(Tab[i].codeCat, codeCatLu);
    					printf("\nSi vous souhaitez effectuer une autre modification, rentrez 1, 2 ou 3, sinon rentrez 0 pour quitter.\n\n");
    					codeLu = getchar();
    					if(codeLu == '0')
    						printf("\nAffichage des nouvelles informations concernant la personne :\n\n\t%-25s %-25s %-15s %-10s\n\n", Tab[i].nom, Tab[i].prenom, Tab[i].tel, Tab[i].codeCat);
    					break;
    				}
    			default:
    				{
    					printf("\nCode errone. Veuillez saisir a nouveau le code SVP.\n\n");
    					codeLu = getchar();
    					if(codeLu == '0')
    						printf("\nAffichage des nouvelles informations concernant la personne :\n\n\t%-25s %-25s %-15s %-10s\n\n", Tab[i].nom, Tab[i].prenom, Tab[i].tel, Tab[i].codeCat);
    					break;
    				}
    			}
    }
    Et voici ce qui s'affiche si l'on rentre un code ki rentre dans le default (ici le code rentré est 9) :

    9

    Code errone. Veuillez saisir a nouveau le code SVP.


    Code errone. Veuillez saisir a nouveau le code SVP.

    Je ne vois pas pourquoi le message apparait 2 fois...

  2. #2
    Membre éclairé
    Avatar de odsen.s
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    269
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 269
    Par défaut
    Salut,

    getchar() lit le premier caractère sur stdin, mais ne supprime pas les caractères restants. Ainsi, au second appel de getchar(), c'est '\n' qui est lu avant que l'utilisateur puisse faire quoi que ce soit. Je recommande donc de penser à vider stdin après appel de getchar :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdio.h>
     
    int lire_car (void)
    {
       int c = getchar();
       if(c != '\n' && c != EOF)
       {
           int c;
           while((c = getchar() != '\n') && c != EOF)
           {
           }
       }
       return c;
    }

  3. #3
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Dark_Alex69 Voir le message
    Voici le bout de code qui pose problème :
    <...>
    Et voici ce qui s'affiche si l'on rentre un code ki rentre dans le default (ici le code rentré est 9) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    9
     
    Code errone. Veuillez saisir a nouveau le code SVP.
     
     
    Code errone. Veuillez saisir a nouveau le code SVP.
    Je ne vois pas pourquoi le message apparait 2 fois...
    Problème récurrent. Je te conseille de revoir complètement tes saisies.

    http://emmanuel-delahaye.developpez....tes.htm#saisie
    http://emmanuel-delahaye.developpez....s.htm#fichiers

    je ne veux plus jamais voir de gets()...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 25
    Par défaut
    Pour le moment on n'a appris que gets() pour recuperer des string.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 25
    Par défaut
    Pour le message de odsen.s, je n'ai pa trop compris ton code...

  6. #6
    Membre éclairé
    Avatar de odsen.s
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    269
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 269
    Par défaut
    Citation Envoyé par Dark_Alex69 Voir le message
    Pour le moment on n'a appris que gets() pour recuperer des string.
    Berk...
    Où ça ?

    Citation Envoyé par Dark_Alex69 Voir le message
    Pour le message de odsen.s, je n'ai pa trop compris ton code...
    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
    #include <stdio.h>
     
    /* fonction retournant le premier caractere lu
    sur stdin, supprime tous les autres caracteres */
    int lire_car (void)
    {
       /* lecture du premier caractere */
       int c = getchar();
     
       /* si il y a d'autres caracteres dans le flux*/
       if(c != '\n' && c != EOF)
       {
           int c;
           /* on appelle getchar tant qu'il reste des caracteres a lire */
           while((c = getchar() != '\n') && c != EOF)
           {
           }
       }
       return c;
    }

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 25
    Par défaut
    Merci je vais essayer ta solution.

  8. #8
    Membre éclairé
    Avatar de odsen.s
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    269
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 269
    Par défaut
    Je te conseille aussi de visiter les liens donnés par Emmanuel pour apprendre à faire des saisies correctes.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 25
    Par défaut
    Oui, je suis allé voir. Je vais essayer de me familiariser avec les fonctions fgets et compagnie.
    Concernant mon problème, j'ai juste rajouté un fflush(stdin) avant le printf dans le default et le problème a disparu... Merci pour vos réponses !!!

  10. #10
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Dark_Alex69 Voir le message
    j'ai juste rajouté un fflush(stdin) avant le printf dans le default et le problème a disparu...
    Ce n'est certainement pas sur mon site que tu as trouvé ce bricolage. fflush() n'est défini que pour les flux sortants. Le comportement est indéfini sur les flux entrants.

    Je peux déjà t'affirmer que c'est au mieux sans effet et au pire catastrophique, sous unixoïde, même si ça parait fonctionner sous Windows. Ce n'est donc pas une solution.

  11. #11
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Concernant mon problème, j'ai juste rajouté un fflush(stdin) avant le printf
    Le problème est que fflush doit avoir pour argument un flux de SORTIE, pas d'entrée. Le comportement avec un flux d'entrée est dépendant de l'implantation. Ca marche, je crois, comme tu l'espères avec des systèmes type MSwindows, mais pas avec tous les unixoïde. Donc ta solution n'est pas définitive et tu dois toi-même vider le buffer d'entrée.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 25
    Par défaut
    Oui vous avez surement raison. Cependant, pour le moment on ne fait que du MSDOS. Je changerais de façon de faire quand on fera du UNIX...

  13. #13
    Membre éclairé
    Avatar de odsen.s
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    269
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 269
    Par défaut
    Citation Envoyé par Dark_Alex69 Voir le message
    Oui vous avez surement raison. Cependant, pour le moment on ne fait que du MSDOS. Je changerais de façon de faire quand on fera du UNIX...
    Il vaut mieux apprendre à faire des choses correctes de façon portable, pas du bricolage...

  14. #14
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    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 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Dark_Alex69 Voir le message
    Oui, je suis allé voir. Je vais essayer de me familiariser avec les fonctions fgets et compagnie.
    fgets(), au contraire de gets(), permet de faire une saisie limitée (si tu dis
    qu'il faut saisir 10 car., tu pourras pas en entrer 12)...

    Sinon le flush(stdin) est une mauvaise idée. Il dénote un problème assez profond qui n'est pas réglé (juste masqué)...
    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]

  15. #15
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Ha que c'est beau toutes ces structures de contrôle imbriquées

    Celui qui a inventé les fonctions était quand même pas idiot
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  16. #16
    Membre expérimenté
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 181
    Par défaut
    Hmm, c'est marrant, dans mon IUT info, on nous a filé un projet à réaliser et il ressemble furieusement à ton morceau de code source
    Chez nous aussi les gets() et les fflush(stdin) sont enseignés ...

  17. #17
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Pourtant c'est clair :

    K&R :
    int fflush(FILE *stream)
    On an output stream, fflush causes any buffered but unwritten data to be written; on an input stream, the effect is undefined. It returns EOF for a write error, and zero otherwise. fflush(NULL) flushes all output streams.
    Norme C99 (http://www.open-std.org/JTC1/SC22/WG...docs/n1124.pdf)

    7.19.5.2 The fflush function
    Synopsis
    1 #include <stdio.h>
    int fflush(FILE *stream);
    Description
    2 If stream points to an output stream or an update stream in which the most recent operation was not input, the fflush function causes any unwritten data for that stream to be delivered to the host environment to be written to the file; otherwise, the behavior is undefined.
    3 If stream is a null pointer, the fflush function performs this flushing action on all streams for which the behavior is defined above.
    Returns
    4 The fflush function sets the error indicator for the stream and returns EOF if a write error occurs, otherwise it returns zero.


    Faites les venir par ici, vos profs.....

Discussions similaires

  1. problème avec le switch
    Par kayenne77 dans le forum Débuter
    Réponses: 15
    Dernier message: 23/11/2008, 20h52
  2. Problème avec un switch
    Par sibile dans le forum Langage
    Réponses: 2
    Dernier message: 07/08/2008, 18h09
  3. petit problème avec mon switch
    Par beegees dans le forum C++
    Réponses: 2
    Dernier message: 03/05/2008, 19h52
  4. problème avec un switch
    Par Tobleron dans le forum Langage
    Réponses: 3
    Dernier message: 19/02/2007, 22h50
  5. Problème avec un switch contenant des strings
    Par dessinateurttuyen dans le forum Langage
    Réponses: 6
    Dernier message: 18/07/2006, 12h56

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