Répondre à la discussion
Affichage des résultats 1 à 5 sur 5

Problème dans une fonction en Langage C



  1. #1
    lui

    Problème dans une fonction en Langage C


    ------

    bonjour
    ci dessous, une fonction que j'ai faite pour mon projet. Cette fonction à pour role de suprimer un nom dans un fichier qui contient un ensemble de nom.

    au début, une lecture de chaque ligne et la suppression de retour chariot " \n " (cahque ligne contien un seul nom)
    - après je recopie tout les noms dans un tableau de chaine de caractère
    - supprimer le nom voulu et le remplacer par "NULL"
    - et a la fin je recopie les noms de tableau dans le fichier liste.

    en compilant, le programme fonctionne bien avec un seul nom dans la liste, parcontre, avec plus de 3 noms, cette fonction ne fonctionne pas bien, et elle supprime tout les noms sans décrementer le nombre nb_adher (sachant que cette fonction est faite pour supprimer un seul nom a chaque appel, et que dans la liste y a pas de nom identique)


    Ma question:

    Est ce que vous pouvez vérifier cette fonction, et de me faire toute les remarque en vu de régler mon problème et d'améliorer cette fonction.


    //////la fonction:


    //Fonctioin qui supprime un adhérent

    int supprimer(char *nom_sup)
    {
    char nom[20];
    FILE *fich;
    FILE *liste;
    char *nomListe[nb_adher];
    int i, length;

    fich = fopen("liste_adher", "r");
    //copie de contenu de fichier liste dans le tableau de chaine de caractères
    for (i=0; i<nb_adher; i++) //nb_adher: nombre d'adhérent
    {
    fgets(nom,20,fich); // Lecture d'un nom dans le fichier liste
    remove_cr(nom); // Supprimer le retour chariot "\n"
    length = strlen(nom);
    nomListe[i]=malloc(length); //nomListe pointe sur un tableau de type char dont
    //la taille correspond au nom lu ds le fichier
    strcpy(nomListe[i], nom); //copie le contenu de nom ds nomListe
    }
    fclose(fich);

    //supprimer un nom
    for (i=0; i<nb_adher; i++)
    {
    if (strcmp(nomListe[i],nom_sup)==0)
    {
    nomListe[i]=NULL;
    remove(nom_sup); //supprimer la fiche d el'adhérent
    printf("\nAdherent supprimé\n");
    nb_adher--; //mise à jour de nombre d'adhérent
    }
    }

    // Mise à jour de la liste des adhérents après la suppression
    if ((liste = fopen("liste_adher", "w")) == NULL)
    {
    fprintf(stdout, "Erreur Ã* l'ouverture du fichier en mode w.\n");
    exit(0);
    }

    else
    {
    for (i=0; i<nb_adher; i++)
    {
    if (nomListe[i]!=NULL)
    fprintf(liste, "%s\n", (nomListe[i])); //Ecriture de nom dans la liste
    fclose(liste); // Fermeture de fichier
    }
    }


    return 1;
    }

    -----

  2. Publicité
  3. #2
    Gre

    Re : Problème dans une fonction en Langage C

    Citation Envoyé par lui Voir le message
    bonjour
    ci dessous, une fonction[...]
    Si tu fais l'effort d'utiliser les balises CODE et que tu indentes correctement ton code, je te promets de t'aider. Mais là, j'ai la fainéantise de déchiffrer.
    War does not decide who's right, but who's left. (Bertrand Russell)

  4. #3
    invite765732342432
    Invité

    Re : Problème dans une fonction en Langage C

    Bonjour lui,
    Il y a un problème quand tu supprimes le nom:
    Code:
    for (i=0; i<nb_adher; i++)
    {
      if (strcmp(nomListe[i],nom_sup)==0)
      {
        nomListe[i]=NULL;
    (...)
        nb_adher--; 
    // en décrémantant nb_adher dans la boucle, 
    tu changes la condition d'arrêt des deux "for"
     (celui en cours et celui qui permet d'écrire) 
    qui s'arrête trop tôt et ne traite pas le dernier
     enreg. 
    Tu ne peux pas utiliser nb_adher pour être à 
    la fois la taille du tableau ET le nombre 
    d'adhérants... tout au moins pas dans ce 
    programme.
    
      }
    }
    Il y a peut-être d'autres pbs, mais en voilà déjà un... je crois...

    PS: je ne crois pas que char *nomListe[nb_adher]; compile avec nb_adher variable...

  5. #4
    Jean_Luc

    Re : Problème dans une fonction en Langage C

    Salut,

    Je vois 2 autres problèmes en plus de celui que Faith t'as décris:

    Citation Envoyé par lui Voir le message
    Code:
      nomListe[i]=malloc(length);
      strcpy(nomListe[i], nom);
    Là il faut penser au caractère fin de chaine sinon tu risques d'avoir des plantages, en gros il faut écrire:
    Code:
      nomListe[i]=malloc(length+1);
      strcpy(nomListe[i], nom);
    Ensuite:

    Citation Envoyé par lui Voir le message
    Code:
    for (i=0; i<nb_adher; i++)
    { 
      if (nomListe[i]!=NULL)
        fprintf(liste, "%s\n", (nomListe[i])); //Ecriture de nom dans la liste
      fclose(liste); // Fermeture de fichier
    }
    Ici tu fermes le fichier avant d'avoir fini d'écrire la liste. Il faut sortir le fclose de la boucle.

    Un petit détail:

    Citation Envoyé par lui Voir le message
    Code:
    if (strcmp(nomListe[i],nom_sup)==0) 
    {
    nomListe[i]=NULL;
    Ici tu ne libères pas la mémoire allouer plus haut pour le nom. il faudrait écrire:

    Code:
    if (strcmp(nomListe[i],nom_sup)==0) 
    {
      free(nomListe[i]);
      nomListe[i]=NULL;
    De meme à la sortie de la fonction, tu ne libères pas la mémoire. Ce n'est pas trés grave car les fuites mémoires ne seront pas très imporante mais il vaut mieux prendre de bonnes habitudes dès le départ.

    Code:
    for (i=0; i<nb_adher; i++)
    { 
      if (nomListe[i]!=NULL)
        free(nomListe[i]);
    }
    L'Univers est fini. Ah bon déjà ?

  6. A voir en vidéo sur Futura
  7. #5
    lui

    Re : Problème dans une fonction en Langage C

    Je te remerice beaucoup pour la réponse
    cela ma bien servi pour ma fonction!

Discussions similaires

  1. chercher une chaine de caractère dans un texte en Langage C
    Par lui dans le forum Programmation et langages, Algorithmique
    Réponses: 17
    Dernier message: 10/12/2010, 00h01
  2. PIC18F & langage C : Sauvegarder une variable dans la rom
    Par The Viking dans le forum Électronique
    Réponses: 14
    Dernier message: 08/02/2010, 14h04
  3. langage c++ fonction get
    Par Eunomia dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 09/10/2007, 12h54
  4. Fonction attente en langage C
    Par DLEGALL dans le forum Logiciel - Software - Open Source
    Réponses: 3
    Dernier message: 26/03/2006, 16h14
  5. Langage C : pointeur sur une fonction en argument ...
    Par konkombre dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 27/07/2005, 10h29
Découvrez nos comparatifs produits sur l'informatique et les technologies.