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 :

Découpage chaine de caractères


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 34
    Points : 26
    Points
    26
    Par défaut Découpage chaine de caractères
    Bonjour à tous,

    Voila j'ai fait une petite fonction pour découper une chaine de caractère en utilisant strtok () selon un séparateur,sauf que j'affiche tous d'un coup après le découpage. comment je pourrai faire pour stocker le retour de strtok () dans un tableau de chaine de caractère, afin de pouvoir utiliser par la suite chaque partie de la chaine de caractère, comme par exemple pour la chaine de caractère"hello \t world" récupéré hello dans la première case et world dans la deuxième, donc un tableau qui s'adapte à chaque chaine de caractère, mais je ne sais pas comment faire, si quelqu'un peut m'aider svp.

    voila le code:

    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
     int main ()
            {
           char buffer[]= "hello\t world";
           fct_decoupe(buffer);
            return 0;
            }
        char fct_decoupe(char buffer[])
        {
         char *pch = strtok (buffer,"\t" );
         while (pch != NULL)
         {
         printf ("%s\n",pch);
         pch = strtok (NULL, "\t" );
         }
         return 0;
        }

    Merci d'avance.

  2. #2
    Membre éclairé
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Points : 807
    Points
    807
    Par défaut
    Tu peux tout simplement utiliser un tableau à double dimension :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char tab[NB_MAX_WORDS][STRING_MAX_LEN];
    dans lequel tu copies chaque nouvelle instance découpée en incrémentant la case de la première dimension.
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  3. #3
    Membre éclairé Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Points : 790
    Points
    790
    Par défaut
    Avec strtok, ta chaine originale est modifiée. Tu peux donc juste stocker les pointeurs vers chaque retour de strtok.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char * tab[NB_MAX_WORDS];
    ...
    tab[i] = pch;
    Si tu prévois de réutiliser ton buffer pour d'autres analyses mais que tu veux garder tes morceaux de chaine, tu peux les dupliquer dans ce même genre de tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char * tab[NB_MAX_WORDS];
    ...
     
    tab[i] = strdup(pch);
    Dans ce second cas il te faudra désalouer chaque chaine qui aura été crée avec strdup.

  4. #4
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 190
    Points : 380
    Points
    380
    Par défaut @valefor
    salut !
    je crois que le but de la fonction de strtok est bien de remplacer chaque séparateur par un 0 puisque string.h définit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char*	strtok (char*, const char*);
    /*et non pas*/
    char *strtok(const char *s1, const char *s2);
    comme j'avais lu dans un manuel des années 90.

    pour ce qui est de sauvegarder le buffer, je pense plus simple d'écrire avant de le modifier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    reserve = strdup(buffer);
    /*si besoin est ...*/
    free(reserve);
    quand on en a plus besoin, plutôt que de boucler sur tous les pointeurs du tableau.

    A+
    Don't want money. Got money. Want admiration.
    (A tribute to SSG)

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 34
    Points : 26
    Points
    26
    Par défaut
    Bonjour, et Merci pour vos réponses,

    Voila j'ai appliqué ce que valefor m'a dit, mais le souci est que par exemple pour la chaine de caractère "bonjour\t tout\t le monde", dans tab[i], à l'indice 0 j'ai :

    tab[0]: bonjour
    tab[0]: tout
    tab[0]:le monde

    Sauf que moi je veux par exemple
    tab[0]:bonjour
    tab[1]:tout
    tab[2]:le monde

    Mais je ne sais pas comment faire.

    voila le code, si vous pouvez m'aider svp:
    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
     
    #define NB_MAX_WORDS 120
     
        int main ()
        {
       char buffer[]= "bonjour\t tout\t le monde";
       fct_decoupe(buffer);
        return 0;
        }
     
    char fct_decoupe(char buffer[])
    	{
    		char * tab[NB_MAX_WORDS];
    		int taille;
    		int i;
     
    		char *pch = strtok (buffer,"\t");
    		taille = sizeof(pch);
     
    		while (pch != NULL)
    		{
    		   for(i=0;i<taille/4;i++)
    		   {
    			tab[i]=pch;
    			printf ("%d %s\n",i,tab[i]);
    		   }
    			pch = strtok (NULL, "\t");
     
    		}
     
    		return 0;
     
    	}
    Merci d'avance.

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    J'ai légèrement modifié le code, pour rajouter un affichage à chaque itération du while :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ...
    while (pch != NULL)
    	{
    		puts("Nouvelle iteration du while");
    		for(i=0;i<taille/4;i++)
    ...
    J'obtiens :
    Nouvelle iteration du while
    0 bonjour
    Nouvelle iteration du while
    0 tout
    Nouvelle iteration du while
    0 le monde
    Normal que i = 0 tout le temps : il n'y a qu'une itération du for à chaque itération du while. La question est de savoir pourquoi.

    Déjà, tu écris : taille = sizeof(pch); ce qui donne 4. En suite, dans les conditions de boucle du for, tu divises taille par 4. La condition de non sortie est donc i<1...


    Ensuite, en parcourant le man, on lit des choses importantes :
    Citation Envoyé par http://man.developpez.com/man3/strtok.3.php
    Évitez au maximum d'utiliser cette fonction. Sinon, prenez note des informations suivantes :

    Cette fonction modifie son premier argument.
    Les caractères de séparation sont surchargés, leur identité est donc perdue.
    Cette fonction ne doit pas être invoquée sur une chaîne constante.
    La fonction strtok() utilise un buffer statique et n'est donc pas sûre dans un contexte multithread. Dans ce cas il vaut mieux utiliser strtok_r().

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 34
    Points : 26
    Points
    26
    Par défaut
    Merci bktero pour ta réponse,

    pour le for(i=0;i<taille/4;i++), je divise par 4 car, il m'affiche à chaque fois
    0 :bonjour
    1 :bonjour
    2 :bonjour
    3: bonjour
    0 :tout
    1 :tout
    2 :tout
    3: tout
    0 :le monde
    1 :le monde
    2 :le monde
    3: le monde

    Normal que i = 0 tout le temps : il n'y a qu'une itération du for à chaque itération du while.La question est de savoir pourquoi.
    pour le while(pch != NULL), c'est juste une condition d'arrêt.

    ce que je veux c'est avoir dans mon tableau:
    0 :bonjour
    1 :tout
    2 :le monde

    Comment je pourrai modifier mon code pour obtenir cela.
    Merci d'avance

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Voici une version modifiée de ta fonction :

    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
    void fct_decoupe(char buffer[])
    {
    	// Declarations
    	char *decoupage[NB_MAX_WORDS];
    	int nbr=0;
    	int i=0;
     
    	// Premier token
    	char *pch = strtok (buffer,"\t");
    	decoupage[0] = pch;
    	nbr+=1;
     
    	// Recuperation des tokens suivants
    	while( (pch != NULL) && (nbr<NB_MAX_WORDS) )
    	{
    		puts("Nouvelle iteration du while...");
    		pch = strtok (NULL, "\t");
    		decoupage[nbr]=pch;
    		nbr+=1;
    	}
     
    	// Affichage
    	puts("\nAffichage des tokens...");
    	for(i=0;decoupage[i]!=NULL;i++)
            // On pourrait aussi utiliser nbr pour arreter le for
    	{
    		printf("%d --> %s\n",i,decoupage[i]);
    	}
    }
    Qui affiche ce que tu veux. Regarde les différences avec les tiennes et on en parle si besoin

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 34
    Points : 26
    Points
    26
    Par défaut
    Merci beaucoup bktero, ça marche super

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

Discussions similaires

  1. Découpage chaine de caractère
    Par Kishin dans le forum Langage
    Réponses: 1
    Dernier message: 28/04/2009, 16h59
  2. Découpage dynamique d'une chaine de caractère
    Par zut94 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 28/10/2005, 18h49
  3. Découpage de chaine de caractère
    Par tcharles dans le forum C++
    Réponses: 11
    Dernier message: 23/08/2004, 14h34
  4. découpage d'une chaine de caractère
    Par lamojuli dans le forum ASP
    Réponses: 4
    Dernier message: 13/05/2004, 15h00
  5. Réponses: 10
    Dernier message: 17/12/2003, 13h51

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