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 :

pointeur de chaine


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 26
    Points : 11
    Points
    11
    Par défaut pointeur de chaine
    Bonjour,

    Je vous explique mon problème. Il m'est impossible d'utiliser la fonction strtok_r() pour découper une chaine de caractère car celle ci sera récupéré dans un pointeur.
    En gros je voudrais utiliser quelque chose comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char *string = point_string() , *key = NULL, *lasts = NULL; // point_string() retournant donc une chaine de caractère ex : "anglais;français;allemand"
    key = strtok_r(string, ";\r",&lasts);
    printf("%s\n",key);
    Vous avez une idée du moyen d'arriver a mes fins ?
    PS: L'idée de copier le pointeur dans un tableau précédemment crée pourrait être bonne si ma chaine était de taille fixe. Ce qui n'est pas mon cas

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 373
    Points : 23 629
    Points
    23 629
    Par défaut
    Ce n'est pas tant le fait que ta chaîne te soit retournée via un pointeur qui pose problème : c'est toujours le cas. Ce qu'il faut savoir, c'est si la chaîne pointée peut ou non être modifiée, soit parce qu'elle est en mémoire à lecture seule, soit parce qu'on en a besoin ailleurs ou plus tard, dans le programme. Si ça ne pose pas de problème que la chaîne initiale soit modifiée, où qu'elle soit, alors tu peux utiliser « strtok_r() » sans inquiétude.

    Si ce n'est pas possible, le plus propre, à mon avis, consiste à utiliser l'arithmétique des pointeurs pour calculer la longueur de chaque tronçon, d'une part, et ensuite l'opérateur « %.*s » de « printf() » qui te permet non seulement de spécifier la longueur d'une chaîne à afficher, mais qui en plus te permet de passer cette longueur en paramètre.



    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
    #include <stdio.h>
     
    int main (void)
    {
        char const * const chaine = "Un;deux;trois;quatre;cinq";
        char const *ptr1, *ptr2;
     
        ptr1=ptr2=chaine;
     
        if (ptr1 != NULL)
        while (*ptr1!='\0')
        {
            while (*ptr1 != ';' && *ptr1 != '\0') ptr1++;
            printf ("%.*s\n",(int)(ptr1-ptr2),ptr2);
            if (*ptr1!='\0') ptr1++;
            ptr2=ptr1;
        }
     
        return 0;
    }

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 26
    Points : 11
    Points
    11
    Par défaut
    Merci pour la réponse qui fonctionne a merveille mais dans mon cas la finalité serait d'enregistrer les valeurs découper dans un tableau de pointeur ! Avez vous une solution pour se cas précis ?

    ex: tab[0] devra valoir "Un", tab[1] devra valoir "deux" etc etc

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 373
    Points : 23 629
    Points
    23 629
    Par défaut
    Si tu exploites tes tokens avec des pointeurs, ça veut dire qu'ils doivent être stockés sous forme de chaîne quelque part et, dans ce cas, autant découper la chaîne originale comme on l'a dit. Si tu ne peux pas le faire, alors :

    • Tu fais « strlen() » sur ta chaîne pour en connaître la longueur ;
    • Tu fais malloc(taille+1) pour allouer de la mémoire (+1 pour inclure le '\0' final) ;
    • Tu copies ta chaîne dans ton buffer fraîchement alloué avec « strncpy() » ;
    • Tu utilises strtok_r() sur ton buffer.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 26
    Points : 11
    Points
    11
    Par défaut
    Merci pour la réponse mais malheureusement j'avais déjà essayé cette solution et ça ne change rien, strtok_r n'accepte pas le buffer crée !
    Edit: J'ai parlé trop vite ! Problème réglé ! merci !

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

Discussions similaires

  1. pointeurs et chaines de caracteres
    Par lylia SI dans le forum Débuter
    Réponses: 2
    Dernier message: 19/08/2007, 19h00
  2. Pointeurs et chaines de caractères
    Par Maria1505 dans le forum C
    Réponses: 3
    Dernier message: 05/11/2006, 13h46
  3. Réponses: 7
    Dernier message: 04/01/2006, 15h34
  4. Réponses: 4
    Dernier message: 26/09/2005, 22h36
  5. Réponses: 3
    Dernier message: 19/12/2004, 14h30

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