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 :

liste chainnee et linux(gcc), pb.


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2006
    Messages : 14
    Par défaut liste chainnee et linux(gcc), pb.
    Salut tout le monde.

    Bon voila dans le cadre de mon cours de c, un petit exercice consiste a gerer une liste simplement chainée.

    J'ai le petit probleme suivant sous linux:

    lors du choix 2 (supression d'un element), une partie du code me semble "skipée" et le menu principale s'affiche.

    voici le 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
    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    #include <stdio.h>
    //#include <conio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define MAX 20
    
    struct liste{
        char nom[MAX];
        struct liste *PtrSvt;
    };
    
    int main(void){
    
        char Menu, Temp[MAX];
        struct liste *PtrNv, *PtrDeb,*PtrSav, *Ptr;
    
        PtrDeb=NULL;
    
        printf("bienvenue dans l exercice sur les listes chainees\n\n"
            "menu:\n\n"
            "1:   ajout dans la liste.\n"
            "2:   supression dans la liste\n"
            "3:   impression de la liste\n"
            "4:   fin\n"
            "\nFaites votre choix: ");
        scanf("%c", &Menu);
        fflush(stdin);
        
        for(;;){
        switch(Menu){
            case '1':   printf("entrez un nom : (zzzz pour terminer) ");
                fflush(stdin);
                gets(Temp);
                            
                while(strcmp(Temp,"zzzz")){
                    PtrNv=(struct liste *)malloc(sizeof(struct liste));
                    if(PtrNv != NULL){
                    strcpy(PtrNv->nom,Temp);
                    PtrNv->PtrSvt=PtrDeb;
                    PtrDeb=PtrNv;
                    }
                    else
                    printf("Plus de place menoire\n");
    
                    printf("entrez un nom : (zzzz pour terminer) ");
                    fflush(stdin);
                    gets(Temp);
                }
                break;
    
            case '2':   printf("entrer le mot à suprimer: ");
                fflush(stdin);
                fgets(Temp, sizeof(Temp), stdin);
     
                //recherche du nom dans la liste
                Ptr=PtrDeb;
                while((Ptr!=NULL)&&(strcmp(Temp,Ptr->nom))){
                    PtrSav=Ptr;
                    Ptr=Ptr->PtrSvt;
                }
                
                //supression du chainon
                if(Ptr==NULL)
                    printf("Ce nom n'existe pas!\n");
                else{
                    if(Ptr==PtrDeb)
                    PtrDeb=PtrDeb->PtrSvt;
                    else
                    PtrSav->PtrSvt=Ptr->PtrSvt;
                }
                free(Ptr);
                break;
    
            case '3':   if(PtrDeb==NULL)
                    printf("liste vide\n");
                else{
                    Ptr=PtrDeb;
                    while(Ptr!=NULL){
                    puts(Ptr->nom);
                    Ptr=Ptr->PtrSvt;
                    }
                }            
                printf("\n");
                break;
    
            case '4':   printf("Au revoir\n");
                exit(0);
                break;
    
            default:    printf("mauvais choix\n");
        }
        
        printf("menu:\n\n"
               "1:   ajout dans la liste.\n"
               "2:   supression dans la liste\n"
               "3:   impression de la liste\n"
               "4:   fin\n"
               "\nFaites votre choix: ");
        scanf("%c", &Menu);
        fflush(stdin);
        }
        //getch()
        return 0;
    }
    a savoir aussi qu si je le compile a l'ecole, borland, je n'ai aucune erreurs et le menu se s'affiche pas deux fois de suite.

    si quelqu'un peu m'aider merci.

  2. #2
    Membre émérite
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Par défaut
    Salut et bienvenue sur les forums de Developpez

    fflush(stdin) n'est pas standard et ne marche pas toujours.
    Remplace ça par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(getchar() !='\n') ;
    Nas'

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2006
    Messages : 14
    Par défaut
    Nasky, merci pour la rapidité de ta réponce mais, c'a ne résous rien.

    j'ai mis en bleu la partie qui, lors du debugage, n'a aucun effet (skipé?).

    voila ce que j'ai dans la console:

    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
    menu:
     
    1:   ajout dans la liste.
    2:   supression dans la liste
    3:   impression de la liste
    4:   fin
     
    Faites votre choix: 2
    entrer le mot à suprimer: Ce nom n'existe pas!
    menu:
     
    1:   ajout dans la liste.
    2:   supression dans la liste
    3:   impression de la liste
    4:   fin
     
    Faites votre choix:

  4. #4
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Remplace les scanf("%c", &var); par scanf("%c%*c", &var);

    Tu utilises gets, c'est très très très mal, il FAUT utiliser fgets()

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2006
    Messages : 14
    Par défaut
    Merci Skyrunner ca marche maintenant .

    Mais, je ne comprend pas très bien ce que fait le scanf. Si tu peux me l'expliquer?

    et si je met des fgets ca ne marche pas : l'ajout tourne en boucle.
    voila la syntaxe qu j'utilise:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fgest(var, sizeof(var), stdin);
    je me trompe qq part?

    merci pour à deux.

  6. #6
    Membre émérite
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Par défaut
    Citation Envoyé par milambert
    Nasky, merci pour la rapidité de ta réponce mais, c'a ne résous rien.
    Si si ça résout, je viens de tester
    En plus des remarques Skyrunner, voilà ce que je t'avais demandé de faire, je ne sais pas si c'est que t'as fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    scanf("%c", &Menu);
        while(getchar() !='\n');
    Le code marche très bien chez moi en faisant ça (alors qu'avant il sautait la saisie du mot).

    Sinon fait gaffe à fgets(). Elle ajoute un '\n' à la fin de la chaine saisie. Il faut donc le supprimer.

    Nas'

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2006
    Messages : 14
    Par défaut
    Citation Envoyé par Nasky
    Si si ça résout, je viens de tester
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    scanf("%c", &Menu);
        while(getchar() !='\n');
    Le code marche très bien chez moi en faisant ça (alors qu'avant il sautait la saisie du mot).
    '
    autant pour moi, je l'avais mis au mauvais endroit.

    Mais au fait, que dois je utiliser?
    gtes(): on me dit que c'est dangereux(buffer overflow possible)
    fgets tu me dis que c'est a eviter.

    enfin merci tout de même

  8. #8
    Membre émérite
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Par défaut
    autant pour moi
    Au temps pour moi

    Citation Envoyé par milambert
    fgets tu me dis que c'est a eviter.
    Non non non ... je n'ai jamais dit ça C'est la fonction de saisie la plus sécurisée. Je disais juste qu'elle ajoute un '\n' à la fin de la chaine.
    Quand tu sais "bonjour", ça crée une chaine "bonjour\n" (si y'a de la place pour le '\n'). Donc il faut l'enlever.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     char ligne[15];
    fgets(ligne, sizeof ligne, stdin);
    {
     // on cherche le caractère '\n'
    char *p = strchr(ligne, '\n'); 
    // s'il est present
    if(p != NULL)
     *p = '\0' ; // on le vire
    }
    Voilà

    Nas'

  9. #9
    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 Nasky
    fflush(stdin) n'est pas standard et ne marche pas toujours.
    Remplace ça par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(getchar() !='\n') ;
    Cautère, jambe de bois, toussa...

    Plutôt apprendre à faire des entrées solides et propres (qui ne laissent rien trainer...)

    http://emmanuel-delahaye.developpez.com/inputs.htm

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. compilation avec arm-linux-gcc (débutant)
    Par kh@_de_7 dans le forum Linux
    Réponses: 2
    Dernier message: 26/03/2007, 10h58
  2. installer arm-linux-gcc
    Par moulefrite dans le forum Linux
    Réponses: 1
    Dernier message: 23/02/2007, 21h37
  3. Réponses: 4
    Dernier message: 10/11/2005, 11h45
  4. [linux][gcc] Comment travaille t-on avec plusieurs fichiers?
    Par kaygee dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 02/04/2004, 17h48

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