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 :

fonction split (decoupe chaine d'apres un delimiteur)


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 102
    Par défaut fonction split (decoupe chaine d'apres un delimiteur)
    bonjour a tous
    alors voila j'ai cree une fonction split *


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int split(char s[],char* delimiteur)
    {
     
    int i=0;
    char* p = strtok (s, delimiteur); 
    char* tab[20];
       while (p != NULL) 
      { 
            tab[i]=p;
            p = strtok (NULL, delimiteur); 
            i++;
      } 
    return(tab[20]);
    }

    Lors de la compil j'ai un warning

    return transforme un pointeur en entier sans transtypage

    alors voila si quelqu'un pouvait m'aider ce serait genial
    merci d'avance!!!!!!!!

  2. #2
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Que voulez-vous que split() retourne?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 102
    Par défaut
    alors voila un exemple
    split( "je;veux;manger" , ";" );

    return(je veux manger)
    dans un tableau
    avec tab[0]=je
    tab[1]=veux
    tab[2]=manger

    voila ce que j'aimerais qu'elle retourne ma fonction split

  4. #4
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Vous avez déclaré votre tableau comme variable locale à la fonction split(). Il sera donc détruit lorsque la fonction terminera. Il faut utiliser l'allocation dynamique (malloc() et autres) ou bien passer le tableau en paramètre.

  5. #5
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par acik59
    alors voila un exemple
    split( "je;veux;manger" , ";" );

    return(je veux manger)
    dans un tableau
    avec tab[0]=je
    tab[1]=veux
    tab[2]=manger

    voila ce que j'aimerais qu'elle retourne ma fonction split
    Alors pourquoi lui faire retourner un valeur de type int ?
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 102
    Par défaut
    alors voila la nouvelle solution :


    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
    char **decoupe_chaine(char *s, const char *ct)
    {
       char **tab = NULL;
     
       if (s && ct)
       {
          int i;
          char *cs = NULL;
          size_t size = 1;
     
    /* (1) */
          for (i = 0; (cs = strtok (s, ct)); i++)
          {
             if (size <= i + 1)
             {
                void *tmp = NULL;
     
    /* (2) */
                size <<= 1;
                tmp = realloc (tab, sizeof (*tab) * size);
                if (tmp)
                {
                   tab = tmp;
                }
                else
                {
                   fprintf (stderr, "Memoire insuffisante\n");
                   free (tab);
                   tab = NULL;
                   exit (EXIT_FAILURE);
                }
             }
    /* (3) */
             tab[i] = cs;
             s = NULL;
          }
          tab[i] = NULL;
       }
       return tab;
    }

    qu'est ce que vous en penser!!!!!!!!

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Qu'est-ce que ça avance de faire :

    et pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      if ( (s != NULL) && (ct != NULL) )
    ??

    Deuxièmememt, strtok prend la chaîne la première fois, mais après il prend NULL...

    Donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
          for (i = 0; (cs = strtok (s, ct)); i++)
    ne marchera pas.

    De plus, le mettre comme ça ne te permet pas de tester si il est nul, et est inutile..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        cs = strtok (s, ct) ;
        while ( cs !=  NULL )
          {
             ....
     
           cs = strtok (NULL, ct) ;
          }
    Enfin strtok modifie la chaîne d'entrée.... qui devra donc inutilisable après...

  8. #8
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Ta fonction tu peux complètement la recommencer Je te propose cette fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char ** split (const char * str, const char * delim);
    La fonction renvoie un pointeur sur pointeur sur char en vue bien sûr de créer un tableau dynamique de chaîne de caractères, surtout si tu ne connais pas par avance le nombre de mot que tu aura au final !

    L'argument str est la chaîne dont il est préférable de faire une copie à l'intérieur de ta fonction car strtok modifi la chaîne sur laquelle il travail ! Tu pourras donc pourquoi pas en même temps créer une fonction de type strdup

    L'argument delim bin c'est le délimiteur pour découper ta chaîne !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

Discussions similaires

  1. Fonction split et chaines en UTF8
    Par AnkyFive dans le forum Langage
    Réponses: 9
    Dernier message: 05/01/2012, 17h38
  2. Réponses: 1
    Dernier message: 15/02/2011, 23h32
  3. Fonction split() suivant chaine de caracteres
    Par pingouinos_64 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 02/03/2010, 11h46
  4. Fonction split pour chaines de caractères
    Par Munkey74 dans le forum Langage
    Réponses: 6
    Dernier message: 05/06/2007, 21h34
  5. [debutant]fonction "split" avec une chaine comme m
    Par EpOnYmE187 dans le forum Débuter
    Réponses: 2
    Dernier message: 07/11/2005, 22h46

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