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 :

probleme avec fonction decoupe


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 15
    Par défaut probleme avec fonction decoupe
    Bonjour à tous,

    Je viens vous demander votre aide car j'en ai marre des "core dumped" en tentant de créer une fonction qui découpe une chaine de caractère en un tableau de "mots"

    Je vous montre ma fonction (qui à l'air pourtant simple à faire)
    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
     
    #include <stdio.h>
    #include <string.h>
    #include <unistd.h>
    #include <stdlib.h>
     
    char** decoupe(char* chaine){
    char** t = (char**)malloc(5*sizeof(char*));
    char* morceau;
    morceau = strtok(chaine," ");
     
    while (morceau != NULL){
    int i=0;
    t[i]=morceau;
    i++;
    morceau=strtok(NULL," ");
    }
    return t;
    free(t);
    }
     
    int main() {
            char** tableau=decoupe("toto bibi keke");
            printf("salut je mapelle %s",tableau[1]);
            }
    Désolé pour le main() et les "toto bibi keke", c'est uniquement pour tester la fonction

    Merci de votre aide

  2. #2
    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 teufa14 Voir le message
    Je viens vous demander votre aide car j'en ai marre des "core dumped" en tentant de créer une fonction qui découpe une chaine de caractère en un tableau de "mots"

    Je vous montre ma fonction (qui à l'air pourtant simple à faire)
    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
     
    #include <stdio.h>
    #include <string.h>
    #include <unistd.h>
    #include <stdlib.h>
     
    char** decoupe(char* chaine){
    char** t = (char**)malloc(5*sizeof(char*));
    char* morceau;
    morceau = strtok(chaine," ");
     
    while (morceau != NULL){
    int i=0;
    t[i]=morceau;
    i++;
    morceau=strtok(NULL," ");
    }
    return t;
    free(t);
    }
     
    int main() {
            char** tableau=decoupe("toto bibi keke");
            printf("salut je mapelle %s",tableau[1]);
            }
    Désolé pour le main() et les "toto bibi keke", c'est uniquement pour tester la fonction

    Merci de votre aide
    Il faut que la chaine soit modifiable.

    Soit tu passes une chaine modifiable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int main() 
    {
       char chaine[] = "toto bibi keke";
            char** tableau=decoupe(chaine);
            printf("salut je mapelle %s",tableau[1]);
            }
    soit tu fais une copie locale avec strdup() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    char** decoupe(char const * chaine_ori)
    {
       char *chaine = strdup (chaine_ori);
     
    char** t = (char**)malloc(5*sizeof(char*));
    char* morceau;
    morceau = strtok(chaine," ");
    Le cast est inutile... Par contre, il manque les vérifications d'usage (toute allocation peut échouer).

    Attention aussi à la libération ... et le i est trop 'local'. Il est remis à 0 à chaque tour...

  3. #3
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 15
    Par défaut
    ah d'accord. J'essairai cela demain à l'IUT. Il est vrai que la chaîne que j'ai passé n'est pas modifiable, je n'avais pas pensé à ça...

    Merci de ton aide

  4. #4
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 15
    Par défaut
    Me revoici, j'espère que je ne vous dérange pas.
    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
     
    /*Fonction qui découpe une chaine de caractères en un tableau de mots*/
     
    char** decoupe(char* chaine){
     
           char** tableau = NULL;
           /*Allocation de mémoire pour le tableau*/
           tableau = malloc(10*sizeof(char*));
           /*On teste sur l'allocation a bien fonctionné*/
           if (tableau == NULL){
                       perror("Erreur lors du malloc()");
                       exit(0);
                       }
           /*Si elle a bien fonctionné, on continue...*/
           char* morceau = NULL;
           morceau = strtok(chaine," ");
     
           int cpt = 0;
           while (morceau != NULL){
                 tableau[cpt] = morceau;
                 morceau = strtok(NULL," ");
                 }
     
           char**t = tableau;
           free(tableau);
     
           return t;
     
    }
    Je précise que je dois réaliser un projet de messagerie instantanée en cours, c'est pour cela que j'ai besoin que cette fonction soit correcte...
    Je précise aussi que j'ai un peu de mal avec les pointeurs

    Voilà je voudrais juste avoir votre avis, si vous voyez des fautes ou non...

    Merci de votre aide

  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 teufa14 Voir le message
    Je précise aussi que j'ai un peu de mal avec les pointeurs

    Voilà je voudrais juste avoir votre avis, si vous voyez des fautes ou non...
    cpt n'avance pas...

    Il y a une grosse faute de libération. La fonction ne peut pas libérer le bloc dont elle retourne l'adresse. C'est à l'appelant de le faire...

    D'autre part, que se passe-t-il si la chaine a plus de 10 mots ?

    Tu devrais commencer par compter les mots, puis allouer le tableau de pointeurs (avec un de plus pour terminer par un pointeur NULL, par exemple)...

  6. #6
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 15
    Par défaut
    Oups désolé j'ai oublié en effet le cpt++, la fatigue peut-être .
    Ma fonction n'utilisera jamais plus de 10 mots, il y en aura 2 ou 3 au maximum.
    Pour le free, je dois le mettre dans la fonction appelant ma fonction découpe c'est bien ça? (je suis désolé de te poser autant de questions mais j'aimerais bien réussir mon projet... )

    Je te remercie encore une fois pour ton aide

Discussions similaires

  1. [Mail] probleme avec fonction mail() !!!
    Par H-bil dans le forum Langage
    Réponses: 6
    Dernier message: 19/06/2006, 23h45
  2. C++ - Probleme avec fonction virtuelle
    Par vdumont dans le forum C++
    Réponses: 1
    Dernier message: 20/03/2006, 20h49
  3. probleme avec fonctions
    Par Burinho dans le forum C
    Réponses: 8
    Dernier message: 29/12/2005, 21h28
  4. Réponses: 17
    Dernier message: 24/03/2005, 12h24
  5. [langage] problème avec fonction read
    Par domidum54 dans le forum Langage
    Réponses: 2
    Dernier message: 30/03/2004, 20h42

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