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 :

decouper une chaine puis mise en tableau


Sujet :

C

  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Par défaut decouper une chaine puis mise en tableau
    bonsoir à tous,

    je cherche le moyen de découper une chaine et de mettre chaque element dans un tableau

    exemple exemple1 exemple2
    je souhaiterai stocker chaque mot dans un tableau, quelqu'un pourrait m'aider ?

    bonne soirée

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 480
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 480
    Par défaut
    La fonction strtok() sert à découper une chaîne en morceaux (jetons : tokens) selon un jeu de caractères délimiteurs passés dans une autre chaîne.

    Si tu veux stocker cela dans un tableau, tu peux te contenter de de sauvegarder les pointeurs renvoyés par les appels successifs à cette fonction. Si tu as déjà un tableau de buffers à remplir, tu peux utiliser strncpy() pour les y copier.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2010
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 38
    Par défaut
    Personnellement je me suis fais une fonction qui va bien pour ç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
    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
     
    #define Fstrlen strlen
     
    int Fnb_c(const char *s, char c, int taille)
    /* Renvoi le nombre d'occurence de 'c' dans la chaine de char 's' de taille 'taille' */
    {
        if (!taille)
            taille = Fstrlen(s);
     
        int i;
        int retour = 0;
        for(i=0; i<taille; i++)
        {
            if (s[i] == c)
                retour++;
        }
        return retour;
    }
     
    char **Fsplitstr(char *chaine, const char separateur, unsigned int longeur)
    /*
        Coupe une chaine de caractère en sous chaines après chaque caractère séparateur (typiquement ' ' ou '\n'),
        équivalent de la fonction split des objets chaine en python.
     
        Si longeur vaut 0, la fonction tentera de calculer la longeur de la chaine, sinon on bouclera jusqu'a la longeur donné en argument
     
        Tous les caractères séparateur seront remplacés par le caractère \0, du coup la chaine sera considéré comme plusieurs sous chaine.
        La fonction retournera donc un pointeur vers le début de chaque sous chaine.
     
        Le dernier élement du tableau pos_tableau vaudra NULL ce qui permettra de retrouver la fin du tableau
        Le tableau renvoyé est alloué dynamiquement, penser à libérer la mémoire.
    */
    {
        if (!longeur)
            longeur = Fstrlen(chaine);
     
        int cpt = 0;
        unsigned int i;
     
        /* Compte le nombre de lexemes dans la chaine pour allouer la mémoire du tableau de sous chaines */
        int nb_lexemes = Fnb_c(chaine, separateur, longeur) + 2;
     
        /* Le tableau contiendra la position de chaque début de tableau: */
        char **pos_tableau = malloc(nb_lexemes*sizeof(char *));
     
        if (!pos_tableau) return pos_tableau;
     
        /* Envoi le pointeur de la première sous chaine dans le tableau. */
        pos_tableau[0] = chaine;
     
        /* Parcours la chaine de char et remplace les espaces par des caractères nul. */
        for (i=0; i<longeur; i++)
        {
            if (chaine[i] == separateur)
            {
                pos_tableau[++cpt] = &chaine[i+1]; /* ++cpt != cpt++, sinon il saute le premier élément. */
                chaine[i] = '\0'; /* Remplace le séparateur par le caractère nul pour indique la fin de la sous chaine. */
            }
        }
        pos_tableau[cpt+1] = NULL;
        return pos_tableau;
    }
    Ca créé donc dynamiquement un tableau à deux dimensions donc chaque élément est un pointeur vers une adresse de la chaine de caractère.
    Trois points importants, il faut penser à libérer la mémoire depuis le pointeur renvoyé par la fonction, la chaine de caractère initiale est modifiée (plus exactement les caractères de séparation sont remplacés par '\0'.: Pour finir ce tableau à deux dimensions se termine par NULL)

    Exemple d'utilisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void Exemple_Fsplitstr(void)
    /* Coupe une chaine de caractère (qui doit obligatoirement être allouée sur le tas !) en sous-chaines et les affiches. */
    {
        char s[] = "Ceci est une chaine de caractère !";
        char **S_s = Fsplitstr(s, ' ', 0); /* On coupe la chaine de caractère sur chaque espace */
        if (S_s == NULL) return;
     
        int cpt = 0;
        while(S_s[cpt] != NULL)
            printf("%s\n", S_s[cpt++]); /* Affichage de chaine sous-chaine de caractère */
        free(S_s);
    }

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Si tu veux stocker cela dans un tableau, tu peux te contenter de de sauvegarder les pointeurs renvoyés par les appels successifs à cette fonction.
    Faudra quand-même jouer du malloc et du realloc pour avoir un tableau de pointeurs suffisamment grand...

    Citation Envoyé par Obsidian Voir le message
    Si tu as déjà un tableau de buffers à remplir, tu peux utiliser strncmp() pour les y copier.
    strncpy() !!!
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 480
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 480
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    strncpy() !!!
    Oups ! Voila ce que c'est de poster trop tard.
    Corrigé, merci.

  6. #6
    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
    Sinon au cas où et si ce n'est pas à but pédagogique, j'ai une bibliothèque pour travailler sur les chaînes (elle est toujours maintenue) : https://sourceforge.net/projects/cstr/... Si ca peut aider
    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. Réponses: 9
    Dernier message: 26/06/2007, 17h58
  2. Découper une chaine ....
    Par webspeak dans le forum Linux
    Réponses: 8
    Dernier message: 07/11/2005, 15h12
  3. Réponses: 5
    Dernier message: 03/02/2005, 13h59
  4. decouper une chaine de caractere
    Par tibobao dans le forum ASP
    Réponses: 4
    Dernier message: 06/12/2004, 12h26
  5. langage] Découper une chaine suivant un délimiteur
    Par totox17 dans le forum Langage
    Réponses: 2
    Dernier message: 25/11/2002, 16h25

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