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 > Suppression d'un tableau de structure


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développement Informatique : Première année
    Inscrit en
    Janvier 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30

    Informations professionnelles :
    Activité : Développement Informatique : Première année

    Informations forums :
    Inscription : Janvier 2013
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Problème > Suppression d'un tableau de structure
    Salut à tous, je suis un étudiant en développement informatique.

    j'étais en train de coder cet exercice en langage C :

    L'exercice :
    1- Créer une énumération couleur avec la liste suivante :

    -Jaune / -Noir
    -Rouge /-Blanc
    -Bleu

    2- Modifier la structure voiture afin d’ajouter le champ couleur v de type couleur ;

    3- Écrire un programme qui permet de saisir les données d’une voiture et de les afficher ensuite dans une seule ligne ;

    4- Écrire un programme qui permet de remplir un tableau de voitures et de donner la possibilité de modifier et supprimer une voiture selon son matricule ;
    Bon, j'ai tout terminé. Le seul problème que j'ai eu consiste en la dernière tâche dans cet exercice : la suppression d'une voiture selon son matricule. Quand j'enregistre plusieurs voitures dans mon pointeur structuré et que j'essaie de supprimer une voiture que j'ai enregistrée, je reçois une erreur et même si je n'entre que 3 voitures et que j'essaye de supprimer la deuxième, les deux chaines de caractères Matricule et Marques ne s'affichent pas :/ ou parfois affichent des caractères bizarre.

    Voila Mon 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
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    typedef enum clr {jaune,noir,rouge,blanc,bleu}couleur;
     
    typedef struct
    {
    char *Marque;
    char *Matricule;
    int nbr_chevaux;
    couleur coul;
    }voiture ;
     
    void viderBuffer()
    {
        int c = 0;
     	   while (c != '\n' && c != EOF)
     	   {
         	   c = getchar();
        }
    }
     
    int main(int argc, char *argv[])
    {
      voiture *v; //declaration d'un pointeur structuré - comme un tableau -
      v=calloc(1,sizeof(voiture));
      char *rep=malloc(1);
      int i=0,j,y,R,t;
     
    do
    {
      R=0;
     
      printf("\t\t\t  ..::-Menu-::..\n\n 1- Ajouter une voiture.\n 2- Supprimer une voiture.\n 3- Modifier les infos d'une voiture.\n 4- Quitter le programme .\n\n Votre Choix -> "); 
      scanf("%d",&R);
      viderBuffer();
     
      switch (R)
      {
       case 1 : 
        { 
     
             (v+i)->Marque=malloc(1);
             (v+i)->Matricule=malloc(1);
     
             printf("\n\nLa Marque de la voiture > ");
             gets((v+i)->Marque);
     
             printf("Le Matricule de la voiture > ");
             gets((v+i)->Matricule);
     
             printf("Le Nombre de chevaux > ");
             scanf("%d",&(v+i)->nbr_chevaux);
     
             printf("La couleur de la voiture : 0-jaune / 1-noir / 2-rouge / 3-blanc / 4-bleu.\n> ");
             scanf("%d",&(v+i)->coul);
             viderBuffer();
             i++;
         }break;
     
      case 2 :
      {
           printf("Entrer le matricule de la voiture que vous voulez supprimer > ");
           gets(rep);
     
           for(j=0;j<i+1;j++)
           {
             if(strcmp(rep,(v+j)->Matricule)==0)
               {
                  for(y=j;y<i;y++) // la boucle permet de supprimé la voiture qui a le matricule saisi par l'utulisateur 
                    {
                      v[y]=v[y+1]// elle remplace la voiture du matricule choisi par celle qui la suit 
     
                      /*strcpy((v+y)->Marque,(v+y+1)->Marque);  j"ai essayer champs par champs aussi et sa marche pas 
                      strcpy((v+y)->Matricule,(v+y+1)->Matricule);
                      (v+y)->nbr_chevaux=(v+y+1)->nbr_chevaux;
                      (v+y)->coul=(v+y+1)->coul;*/
                    }
     
                    printf("Voiture supprimer !!\n\n");
                    i--;
                    break;
                }
            }
     
              free(rep);
           }break;
     
      case 3 :
           {
                  viderBuffer();
                  printf("Entrer le matricule de la voiture que vous voulez Modifier > "); // modification des infos d'un voiture selon le matricule
                  gets(rep);
     
                  for(j=0;j<i+1;j++)
                  {
                               if(strcmp(rep,(v+j)->Matricule)==0)
                               {
                                                  printf(" \n\nChoisissez ce que vous voulez changer : \n1- Marque.\n2- Matricule.\n3- Nombre de chevaux.\n4- Couleur de la voiture.\nChoix > ");
                                                  scanf("%d",&t);
                                                  viderBuffer();
                                                  switch (t)
                                                  {
                                                         case 1 : 
                                                         {                                                         
                                                              printf("Marque > ");
                                                              gets((v+j)->Marque);
                                                         }break;
     
                                                         case 2 :
                                                         {
                                                              printf("Matricule > ");
                                                              gets((v+j)->Matricule);
                                                         }break;
     
                                                         case 3 :
                                                         {
                                                               printf("Nombre de chevaux -> ");
                                                               scanf("%d",&(v+j)->nbr_chevaux);
                                                               viderBuffer();
                                                         }break;
     
                                                         case 4 : 
                                                          {
                                                                printf("Couleur de voiture");
                                                                scanf("%d",&(v+j)->coul);
                                                                viderBuffer();
                                                          }break;
     
                                                          default : printf("Invalid Touche\n\n");
                                                     }
                                  printf("\n\t\t\tChangement Enregistrer !!\n\n");
                                  break;
                            }
              }
        }break; 
     
       case 4 : printf("\n\n\t\t\tA Bientot :) \n\n");break;
     
       default : printf("\t\t\tErreur : \n La valeur que vous venez de saisire n'existe pas dans le menu !!\n\n\n");
    }
    }
    while(R!=4);
     
    printf("infos sur les voitures existante : \n"); 
     
    for(y=0;y<i+1;y++)
     printf("\nVoiture Numero %d : Marque %s | Couleur %d |Matricule %s | Nbr de chevaux %d \n\n",y+1,(v+y)->Marque,(v+y)->coul,(v+y)->Matricule,(v+y)->nbr_chevaux);
     
      system("PAUSE");	
      return 0;
    }
    Je cherche à trouver la cause de cette erreur que je reçois et vous pouvez même me donner des remarques sur ce travail avec des infos pour mieux le gérer , Merci d'avance pour votre aide !!

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    v=calloc(1,sizeof(voiture));
    Avec ceci tu n'alloues de l'espace que pour une seule voiture. Les appels à (v+i)->... ne sont valides que pour i=0 au delà, tu utilises un espace non réservé.

    Similairement, char *rep=malloc(1); va allouer l'espace pour un seul caractère.

    Préfère utiliser la fonction fgets() plutôt que gets()
    Pourquoi gets est-elle dépréciée en faveur de fgets ?

    Pense à libérer la mémoire de toutes les voitures crées à la fin.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développement Informatique : Première année
    Inscrit en
    Janvier 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30

    Informations professionnelles :
    Activité : Développement Informatique : Première année

    Informations forums :
    Inscription : Janvier 2013
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Merci winjerome , ta réponse était très utile pour moi .

    Bon, j'ai réussi à résoudre le problème que j'avais et je pense que c'était a cause de l'allocation
    v=calloc(1,sizeof(voiture));
    qui n'alloue de l'espace que pour une seul voiture, alors j'ai ajouté un realloc avant la fin de l'ajout pour allouer de l'espace à une nouvelle voiture. avant je croyais que les pointeurs peuvent allouer de l'espace automatiquement sans avoir besoin de ré-allouer a chaque fois, ce qui est complètement faux ^^'.

    j'ai aussi utiliser fgets a la place de gets et j'ai libérer la mémoire utilisé .

    Voila a quoi ressemble mon 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
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    typedef enum clr {jaune,noir,rouge,blanc,bleu}couleur;
     
    typedef struct
    {
    char *Marque;
    char *Matricule;
    int nbr_chevaux;
    couleur coul;
    }voiture ;
     
    void viderBuffer()
    {
        int c = 0;
     	   while (c != '\n' && c != EOF)
     	   {
         	   c = getchar();
        }
    }
     
    int main(int argc, char *argv[])
    {
      voiture *v=calloc(1,sizeof(voiture)); //declaration d'un pointeur structuré - comme tableau -
      char *rep=malloc(51); 
      int i=0,j,y,R,t;
     
    do
    {
      R=0;
     
      printf("\t\t\t  ..::-Menu-::..\n\n 1- Ajouter une voiture.\n 2- Supprimer une voiture.\n 3- Modifier les infos d'une voiture.\n 4- afficher les infos des voitures.\n 5- Quitter le programme .\n\n Votre Choix -> "); 
      scanf("%d",&R);
      viderBuffer();
     
      switch (R)
      {
       case 1 : 
        { 
     
             (v+i)->Marque=malloc(51);
             (v+i)->Matricule=malloc(51);
     
             printf("\n\n La Marque de la voiture > ");
             fgets((v+i)->Marque,50,stdin);
             *((v+i)->Marque+(strlen((v+i)->Marque)-1))='\0';// Remplace le '\n' de validation par '\0'
     
     
             printf(" Matricule > ");
             fgets((v+i)->Matricule,50,stdin);
             *((v+i)->Matricule+(strlen((v+i)->Matricule)-1))='\0';// Remplace le '\n' de validation par '\0'
     
             printf(" Nombre de chevaux > ");
             scanf("%d",&(v+i)->nbr_chevaux);
     
             printf(" La couleur :\t0- jaune | 1- noir | 2- rouge | 3- blanc | 4- bleu.\n> ");
             scanf("%d",&(v+i)->coul);
             viderBuffer();
             i++;
             v=realloc(v,sizeof(voiture)*(i+1));
         }break;
     
      case 2 :
      {
           printf("Entrer le Matricule de la voiture a supprimer > ");
           fgets(rep,50,stdin);
           *(rep+(strlen(rep)-1))='\0';
     
           for(j=0;j<i;j++)
           {
             if(strcmp(rep,(v+j)->Matricule)==0)
               {
                  for(y=j;y<i;y++) // la boucle permet de supprimé la voiture qui a le matricule saisi par l'utulisateur 
                    {
                      v[y]=v[y+1]; // elle remplace la voiture du matricule choisi par celle qui la suit 
                    }
     
                    printf("\n\t\t\tVoiture supprimer !!\n\n");
                    i--;
                    system("PAUSE");break;
                }
            }
      }break;
     
      case 3 :
           {
                  viderBuffer();
                  printf("Entrer le matricule de la voiture que vous voulez Modifier > "); // modification des infos d'un voiture selon le matricule
                  fgets(rep,50,stdin);
                  *(rep+(strlen(rep)-1))='\0';
     
                  for(j=0;j<i;j++)
                  {
                               if(strcmp(rep,(v+j)->Matricule)==0)
                               {
                                                  printf(" \n\nChoisissez ce que vous voulez changer : \n1- Marque.\n2- Matricule.\n3- Nombre de chevaux.\n4- Couleur de la voiture.\nChoix > ");
                                                  scanf("%d",&t);
                                                  viderBuffer();
                                                  switch (t)
                                                  {
                                                         case 1 : 
                                                         {                                                         
                                                              printf("Nouvelle Marque > ");
                                                              fgets((v+j)->Marque,51,stdin);
                                                              *((v+i)->Marque+(strlen((v+i)->Marque)-1))='\0';// Remplace le '\n' de validation par '\0'
                                                              printf("\n\t\t\tChangement Enregistrer !!\n\n");
                                                         }break;
     
                                                         case 2 :
                                                         {
                                                              printf("Nouveau Matricule > ");
                                                              fgets((v+j)->Matricule,51,stdin);
                                                              *((v+i)->Matricule+(strlen((v+i)->Matricule)-1))='\0';// Remplace le '\n' de validation par '\0'
                                                              printf("\n\t\t\tChangement Enregistrer !!\n\n");
                                                         }break;
     
                                                         case 3 :
                                                         {
                                                               printf("Nombre de chevaux -> ");
                                                               scanf("%d",&(v+j)->nbr_chevaux);
                                                               viderBuffer();
                                                               printf("\n\t\t\tChangement Enregistrer !!\n\n");
                                                         }break;
     
                                                         case 4 : 
                                                          {
                                                                printf("Nouvelle Couleur de voiture : \n 0-> jaune | 1-> noir | 2-> rouge | 3-> blanc | 4-> bleu.\n> ");
                                                                scanf("%d",&(v+j)->coul);
                                                                viderBuffer();
                                                                printf("\n\t\t\tChangement Enregistrer !!\n\n");
                                                          }break;
     
                                                          default : printf("Invalid Touche\n\n");
                                                     }break;system("PAUSE");                                                         
                            }
              }
        }break; 
     
       case 4 : 
            {
                printf("\n\n\t\t\tInfos sur les voitures existante : \n\n");
     
                for(y=0;y<i;y++) // affichage des infos sur toute les voiture enregistré 
                                 printf("\nVoiture Numero %d : Marque %s | Couleur %d |Matricule %s | Nbr de chevaux %d \n",y+1,(v+y)->Marque,(v+y)->coul,(v+y)->Matricule,(v+y)->nbr_chevaux);
              }system("PAUSE");break;
       case 5 : printf("\n\n\t\t\tA Bientôt !! \n\n");break;
     
       default : printf("\t\t\tErreur : \n La valeur que vous venez de saisire n'existe pas dans le menu !!\n\n");
    }
    printf("\n");
    }
    while(R!=5);
     
     
    // libération de la mémoire 
    free(rep);
    free(v);
     
      system("PAUSE");	
      return 0;
    }
    Tu peut aussi ajouter des remarques sur ce code .
    Merci d'avance.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 15/06/2010, 10h58
  2. problème d'initialisation d'un tableau de structure
    Par hamma2 dans le forum Débuter
    Réponses: 1
    Dernier message: 08/03/2010, 19h26
  3. Problème avec un tableau de structure
    Par pek.plus.ultra59 dans le forum C
    Réponses: 47
    Dernier message: 01/04/2008, 16h17
  4. Problème avec un tableau de structure
    Par Sofute dans le forum C
    Réponses: 10
    Dernier message: 16/10/2007, 15h29
  5. Problème free() : Tableau de structures
    Par bit_o dans le forum C
    Réponses: 11
    Dernier message: 28/04/2007, 15h53

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