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 :

je HAIS strsep


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 56
    Par défaut je HAIS strsep
    Bonjour,

    Une fois de plus je m'arrache les cheveux avec cette fichue fonction strsep. Je comprends pas
    J'ai un fichier avec tout plein de lignes du genre"_0__X:_2598___\tY:1612__L:6565" où _ est un espace et \t une tabulation.

    Je cherche à extraire le 2598 et le 6565.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    valeurX = malloc(sizeof(char)*5);
    valeurY = malloc(sizeof(char)*5);
    if(chaine != NULL)
        strsep( &chaine , "X: " ); // je le fais une fois dans le vide. Normalement, la valeur renvoyé est "_0__", et ma variable 'chaine' devient "_2598___\tY:1612__L:6565"
    if(chaine != NULL)
        valeurX = strsep( &chaine , " " ); // chaine devient "___\tY:1612__L:6565" ou "\tY:1612__L:6565" ou encore "Y:1612__L:6565" je ne sais pas, mais ça n'a pas d'importance
    if(chaine != NULL)
        strsep( &chaine , "Y: ");
    if(chaine != NULL)
        valeurY = strsep( &chaine , " " );
    Sauf que bien sûr, ça ne fait pas du tout ce que je veux. D'habitutde je m'en sors avec moult tatônnements, mais cette fois j'aimerais bien avoir une explication un peu plus détaillée que celle du man sur ce que fait cette fonction...

    Sinon pour faire ce que je veux faire, il y a une autre méthode plus adaptée ? Aaah, en Perl, comme ce serait facile

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 315
    Billets dans le blog
    5
    Par défaut
    En faisant un man strsep je lis ceci :
    BUGS
    Be cautious when using this function. If you do use it, note that:

    * This function modifies its first argument.

    * This function cannot be used on constant strings.

    * The identity of the delimiting character is lost.
    As-tu pris en compte ces remarques qui sont classées d'ailleurs dans la rubrique BUGS?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 56
    Par défaut
    Oui j'ai pris en compte ces trois remarques. Ceci dit, je n'ai pas pris en compte le fait qu'elles soit considérées comme des "bugs". Mais je ne vois pas trop ce que ça change, j'ai plus l'impression que j'utilise la fonction de travers

  4. #4
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 315
    Billets dans le blog
    5
    Par défaut
    Ajoute des printf(); après chaque strsep();. Tu pourras ainsi contrôler la modification de chaine au fur et à mesure de l'avancement de ta procédure.

  5. #5
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Salut,

    quand tu donnes pour délimiteurs la chaine "X: ", cela signifie que strsep considère comme délimiteurs les caractères 'X' ou ':' ou ' '.

    Les printf de gerald3d sont une très bonne idée ... lire la doc aussi par exemple tu peux trouver cet exemple qui te montre ce qui se passe quand il y a plusieurs délimiteurs, quand ils sont consécutifs ...

    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
     
     #include <string.h>
         #include <stddef.h>
     
         ...
     
         const char string[] = "words separated by spaces -- and, punctuation!";
         const char delimiters[] = " .,;:!-";
         char *running;
         char *token;
     
         ...
     
         running = strdupa (string);
         token = strsep (&running, delimiters);    /* token => "words" */
         token = strsep (&running, delimiters);    /* token => "separated" */
         token = strsep (&running, delimiters);    /* token => "by" */
         token = strsep (&running, delimiters);    /* token => "spaces" */
         token = strsep (&running, delimiters);    /* token => "" */
         token = strsep (&running, delimiters);    /* token => "" */
         token = strsep (&running, delimiters);    /* token => "" */
         token = strsep (&running, delimiters);    /* token => "and" */
         token = strsep (&running, delimiters);    /* token => "" */
         token = strsep (&running, delimiters);    /* token => "punctuation" */
         token = strsep (&running, delimiters);    /* token => "" */
         token = strsep (&running, delimiters);    /* token => NULL */
    Trouvé dans le manuel de la GNU libc.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 56
    Par défaut
    Oui par "tatônner" dans mon premier post, j'entends "mettre des printf partout et adapter mon pgrogramme pour que ça marche". Mais j'aurais voulu éviter ça.

    Sinon merci de la précision concernant les séparateurs, c'est exactement sur ce point que je me trompais.

    Une dernière chose : pour faire ce que je veux faire (à savoir extraire la valeurs du X et celle du Y), il n'y a pas un peu plus adapté ?? Genre un équivalent de la commande cut ? avec des expressions régulières ça irait tout seul, mais ça a l'air pénible à mettre en oeuvre en C...

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

Discussions similaires

  1. Je hais les guillemets
    Par Nemesis007 dans le forum Langage
    Réponses: 4
    Dernier message: 31/03/2008, 15h48
  2. [vba-E].find je te hais!
    Par sk8bcn dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 03/10/2006, 10h38

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