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 :

Decompose une chaine en tableau de caractaire: Erreur de segmentation (core dumped)


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Novembre 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3
    Par défaut Decompose une chaine en tableau de caractaire: Erreur de segmentation (core dumped)
    Bonjour,
    Je suis nouveau sur le forum et nouveau egalement en programmation "C", et depuis une semaine j'ai un probleme avec ce code qui m'affiche cette erreur a chaque fois que je veux l'executer:
    "Erreur de segmentation (core dumped)"
    La compilation se passe sans erreur mais l'execution ne marche pas.
    C'est la fonction "**decompose_mot" qui ne marche pas sinon les autres fonctionnent car je les ai testé un par un. Cette fonction doit decomposé une phrase en un tableau de caractères.

    Egalement, je voudrais savoir où est-ce que je pourrai trouver une bonne explication sur les pointeurs (de type: **pointeur) et structures car je ne comprends pas ces deux elements du tout.


    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
    # include <stdio.h>
    # include <stdlib.h>
     
    /* Fonction qui compte le nombre de
       caractère de la chaine passé en argument*/
    int compte_caract(char * chaine)
    {
      int i=0;
      while(chaine[i]!='\0')
        i++;
      return i;
    }
     
     
    /* Fonction qui compte le nombre de
       mot de la chaine passé en argument*/
    int compte_mot(char *chaine)
    {
      int i,j,mot=0;
      i=compte_caract(chaine);
      for(j=0;j<=i;j++)
        {
          if(chaine[j]==' ')
        {
          mot++;
        }
        }
      return mot+1;
    }
     
    /* A REVOIR
       Fonction qui decompose une cahine de caractère en un tableau
       de caractère.*/
    char **decompose_mot(char *chaine)
    {
      char **tab;
      int i,j,a,b,k=0;
      i=compte_mot(chaine);
      tab=(char **)malloc(i*sizeof(char*));
      for(a=0;a<i;a++)
        {
          b=0;
          while(chaine[k]!=' ')
            {
              tab[a][b]=chaine[k];
              b++;
              k++;
            }
          tab[a][b]='\0';
          k++;
        }
      return  tab;
    }
     
    /* Fonction qui comapare deux chaines et renvoie la difference en
       ascii des deux premiers caratères différents sinon renvoie 0.*/
    int compare_chaine(char *ch1, char *ch2)
    {
      int i,t1,t2,k,c;
      t1=compte_caract(ch1);
      t2=compte_caract(ch2);
      if(t1<t2)
        c=t1;
      else
        c=t2;
      printf("c= %d\n",c);
      for(i=0;i<c;i++)
        {
          if(ch1[i]!=ch2[i])
        return ch1[i]-ch2[i];
        }
      return 0;
    }
     
    // Fonction principale
    int main()
    {
      char *car="AdBmamX toto tata mimi";
      char *c="AdBmamX";
      printf("%s",decompose_mot(car));
      printf("La difference entre ch1 et ch2 est: %d\n",compare_chaine(car,c));
      return;
    }

  2. #2
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab=(char **)malloc(i*sizeof(char*));
    Quand tu fais ça, tu ne crées qu'un tableau de pointeurs. C'est à dire que tu te retrouves avec un ensembles de pointeurs. Si tu veux pouvoir les utiliser en temps que chaines de caractères, il va falloir aussi allouer chacun d'eux.

    Edit: Vu que tu ne sais pas la taille du mot à l'avance, je te conseillerais de le parcourir une fois pour connaitre sa taille, d'allouer le pointeur en fonction et de le stocker dans le pointeur.

  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 yacson Voir le message
    Je suis nouveau sur le forum et nouveau egalement en programmation "C", et depuis une semaine j'ai un probleme avec ce code qui m'affiche cette erreur a chaque fois que je veux l'executer:
    "Erreur de segmentation (core dumped)"
    La compilation se passe sans erreur mais l'execution ne marche pas.
    Il faudrait déjà corriger ça :
    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
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c: In function `decompose_mot':
    main.c:37: warning: unused variable `j'
    main.c: In function `compare_chaine':
    main.c:59: warning: unused variable `k'
    main.c: At top level:
    main.c:77: warning: function declaration isn't a prototype
    main.c: In function `main':
    main.c:78: warning: initialization discards qualifiers from pointer target type
    main.c:79: warning: initialization discards qualifiers from pointer target type
    main.c:80: warning: char format, pointer arg (arg 2)
    main.c:82: warning: `return' with no value, in function returning non-void
    Linking console executable: console.exe
    Process terminated with status 0 (0 minutes, 7 seconds)
    0 errors, 7 warnings
    Si ton compilateur ne dit rien, c'est qu'il est probablement mal réglé :

    http://emmanuel-delahaye.developpez....tm#cfg_compilo

    Ton code corrigé et commenté.
    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
     
    # include <stdio.h>
    # include <stdlib.h>
     
    /* 0=normal 1=debug */
    #define DBG 0
     
    /* Fonction qui compte le nombre de
       caractère de la chaine passé en argument*/
    int compte_caract (char const *chaine)
    {
       int i = 0;
       while (chaine[i] != '\0')
          i++;
       return i;
    }
     
    /* Fonction qui compte le nombre de
       mot de la chaine passé en argument*/
    int compte_mot (char const *chaine)
    {
       int i, j, mot = 0;
       i = compte_caract (chaine);
       for (j = 0; j <= i; j++)
       {
          if (chaine[j] == ' ')
          {
             mot++;
          }
       }
       return mot + 1;
    }
     
    /*  Fonction qui decompose une chainede caractère en un tableau
       de caractère.*/
    char **decompose_mot (char const *chaine)
    {
       int i = compte_mot (chaine);
    #if DBG
       printf ("i=%d '%s'\n", i, chaine);
    #endif
       /* -ed- ajoute 1 pour terminer la liste des pointeurs par NULL. */
       char **tab = malloc ((i + 1) * sizeof (char *));
       if (tab != NULL)
       {
          /* -ed- j n'est pas utilisee */
          int /*j, */ a, b, k = 0;
          for (a = 0; a < i; a++)
          {
             /* -ed- il faut ranger les caracteres quelque part...
                j'ai mis une taille qui est garantie etre correcte, mais
                qui n'est pas optimisee.
              */
             tab[a] = malloc (compte_caract (chaine) + 1);
     
             /* recopie du mot */
             b = 0;
             while (chaine[k] != ' ' && chaine[k] != 0)
             {
                tab[a][b] = chaine[k];
                b++;
                k++;
             }
             tab[a][b] = '\0';
    #if DBG
             printf ("tab[%d]='%s'\n", a, tab[a]);
    #endif
             /* sauter le separateur */
             k++;
          }
          tab[a] = NULL;
    #if DBG
          printf ("tab[%d]='%s'\n", a, tab[a]);
    #endif
       }
     
       return tab;
    }
     
    /* Fonction qui comapare deux chaines et renvoie la difference en
       ascii des deux premiers caratères différents sinon renvoie 0.*/
    int compare_chaine (char const *ch1, char const *ch2)
    {
       int i, t1, t2, /* k, */ c;   /* -ed- k n'est pas utilisee */
       t1 = compte_caract (ch1);
       t2 = compte_caract (ch2);
       if (t1 < t2)
          c = t1;
       else
          c = t2;
       printf ("c= %d\n", c);
       for (i = 0; i < c; i++)
       {
          if (ch1[i] != ch2[i])
             return ch1[i] - ch2[i];
       }
       return 0;
    }
     
    // Fonction principale
    /* -ed- ajoute void, car il n'y a pas de parametres */
    int main (void)
    {
    /* -ed- ajoute const, car une chaine litteralle n'est pas modifiable */
       char const *car = "AdBmamX toto tata mimi";
       char const *c = "AdBmamX";
    /* -ed-
       printf ("%s", decompose_mot (car));
     
      Ceci n'a aucun sens, vu que  decompose_mot() retourne
      l'adresse d'un tableau de pointeurs sur char.
    */
     
    /* on recupere l'adresse du tableau de pointeurs */
       {
          char **pp = decompose_mot (car);
          if (pp != NULL)
          {
             /* lecture des chaines */
             {
                int i = 0;          /* 1ere chaine */
                /* on lit chaque pointeur tant qu'il nne vaut pas NULL */
                while (pp[i] != NULL)
                {
                   printf ("'%s'\n", pp[i]);
                   i++;
                }
             }
     
             /* liberation */
             {
                int i = 0;
                while (pp[i] != NULL)
                {
     
                   /* -ed- liberation du bloc */
                   free (pp[i]), pp[i] = NULL;
                   i++;
                }
             }
             free (pp), pp = NULL;
          }
       }
       printf ("La difference entre ch1 et ch2 est: %d\n",
               compare_chaine (car, c));
     
    /* -ed- main() retourne un int.
        0 est une valeur standard qui sigifie OK pour le systeme */
       return 0;
    }
    C'est la fonction "**decompose_mot" qui ne marche pas sinon les autres fonctionnent car je les ai testé un par un.
    Bien.

    Egalement, je voudrais savoir où est-ce que je pourrai trouver une bonne explication sur les pointeurs (de type: **pointeur) et structures car je ne comprends pas ces deux elements du tout.
    Tu n'as pas eu de cours ? Tu n'as pas compris le cours ?

    http://emmanuel-delahaye.developpez.....htm#pointeurs

  4. #4
    Membre à l'essai
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Novembre 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3
    Par défaut
    Merci beaucoup de vous etre interssé à mon cas, effectivement le code que vous avez mondifié fonctionne correctement et je comprends mieux, mais j'avais juste une incompréhension quand a ces parties.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #if DBG
          printf ("tab[%d]='%s'\n", a, tab[a]);
    #endif
    Vous avez declaré une constante DGB mais je ne comprends pas quand vous utilisez le "if" avec le "#".

    A quoi cette maniere correspond t'elle et comment agit-elle.

  5. #5
    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 yacson Voir le message
    j'avais juste une incompréhension quand a ces parties.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #if DBG
          printf ("tab[%d]='%s'\n", a, tab[a]);
    #endif
    Vous avez declaré une constante DGB mais je ne comprends pas quand vous utilisez le "if" avec le "#".
    A quoi cette maniere correspond t'elle et comment agit-elle.
    C'est une des utilisation du préprocesseur. Ca permet de faire de la compilation conditionnelle. Si DBG vaut 1, le code est compilé. Si il vaut 0, il ne l'est pas. Ca permet de passer d'un mode à l'autre rapidement sans avoir (ou très peu) à modifier le code source.

    C'est une technique de mise au point très commune.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Novembre 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3
    Par défaut
    Ok merci pour toutes ces informations et bonne continuation

    Merci enormement.
    A++

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

Discussions similaires

  1. Erreur de segmentation (core dumped)
    Par yansei dans le forum C
    Réponses: 13
    Dernier message: 07/06/2008, 11h51
  2. Erreur de segmentation (core dumped)
    Par benja507 dans le forum Débuter
    Réponses: 11
    Dernier message: 14/05/2008, 17h37
  3. Erreur de segmentation (core dumped)
    Par mansour67 dans le forum wxWidgets
    Réponses: 3
    Dernier message: 05/03/2008, 18h11
  4. Réponses: 6
    Dernier message: 14/01/2008, 16h47
  5. erreur de segmentation core dumped
    Par panganino dans le forum Langage
    Réponses: 2
    Dernier message: 03/01/2008, 12h45

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