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 STRTOK ne marche pas


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Fonction STRTOK ne marche pas
    Bonjour,

    J'essaye d'utiliser la fonction strtok mais ça plante ( une fenêtre windows s'affiche pour dire qu'il y ait eu une erreure)

    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
    int main ()                     
    {                                                                
    char *pTemp ;                                                           
    char *pGCXItems;                                                        
    char *pGCXItem ;
    char *pOwner ; 
    char *pGCX;                                                        
    int iGCXSize , LnTemp ;                                                 
    pTemp = NULL;                                                        
    pGCXItems = NULL;                                                    
    pGCXItem = NULL;                                                     
    GCXStruct GCX;
    GCXStruct * pGCXValues;
    pGCXValues =&GCX;
    pOwner = "RIM"; 
    char	*separateur = { "+" };  
    pGCX = "GCX+43+RIM:ADAM:RIMA:ADAMA*RIM1:ADAM1:RIMA1:ADAMA1";                                                                           
    pTemp = strtok(pGCX, separateur);   
     
    cout << "Le pTemp est  = "
        << pTemp 
         << endl;
    system("PAUSE");
    return 0;  
     
    }
    Merci pour votre aide.

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Tout d'abord, le code que tu fournis n'est pas complet, il a fallut que je commente 3 lignes pour arriver à compiler
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //GCXStruct GCX;
    //GCXStruct * pGCXValues;
    //pGCXValues =&GCX;
    Sinon, ton problème vient du fait que strtok() modifie la chaine passé en paramètre et que cette chaine et du type non modifiable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pGCX = "GCX+43+RIM:ADAM:RIMA:ADAMA*RIM1:ADAM1:RIMA1:ADAMA1";
    Pour que ce que tu veux faire fonctionne, il faut passer cette chaine en modifiable en la recopiant dan un tableau de caractères
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char buf[1024];
    strcpy(buf, pGCX);
    pTemp = strtok(buf, separateur);
    Je l'ai fais à la hache, à toi d'arranger le code
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci pour ta réponse (la première), j'ai essayé avec ta correction mais ça ne marche pas, j'utilise DEVC++ pour progrmmer , peut être qu'il ne comprend pas la fonction strtok, mais à ce moment là il l'aurait dit pendant la compilation...?

    Merci ram-0000 je vais essayer ta solution.

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Je l'ai fait sous Visual Studio 2005
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Invité(e)
    Invité(e)
    Par défaut
    Bonsoir,
    Citation Envoyé par grenadinette Voir le message
    Merci pour ta réponse (la première), j'ai essayé avec ta correction mais ça ne marche pas, j'utilise DEVC++ pour progrmmer , peut être qu'il ne comprend pas la fonction strtok, mais à ce moment là il l'aurait dit pendant la compilation...?
    strtok fait parti du standard.
    Le problème doit donc venir de son utilisation :
    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.
    Sinon, cout c'est du c++, pas du c et system("PAUSE"); n'est pas portable.

    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
    #include <string.h>
    #include <stdio.h>
     
    int main(void)
    {
        char *pTemp;
        char pGCX[256] = "GCX+43+RIM:ADAM:RIMA:ADAMA*RIM1:ADAM1:RIMA1:ADAMA1";
        char separateur[] = "+";
     
        pTemp = strtok(pGCX, separateur);
     
        printf("Le pTemp est = %s\n", pTemp);
     
        return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ ./a.out 
    Le pTemp est = GCX

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci ram-0000 ça marche maintenant, mais j'ai une question à poser pour bien comprendre, le tableau Buf doit-il contenir plus de caractères que pGCX, car le contenu de mon pGCX peut atteindre 40000 caractères?


    Merci

  7. #7
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par mabu Voir le message
    Le problème doit donc venir de son utilisation
    Je ne comprends pas dans le man:
    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.
    Cela veut dire quoi "Les caractères de séparation sont surchargés, leur identité est donc perdue." ?
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  8. #8
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par grenadinette Voir le message
    Merci ram-0000 ça marche maintenant, mais j'ai une question à poser pour bien comprendre, le tableau Buf doit-il contenir plus de caractères que pGCX, car le contenu de mon pGCX peut atteindre 40000 caractères?
    Euh oui, sinon il va y avoir des dégats

    Une question, ces 40000 caractères, ils viennent d'où. Ils seront toujours déclarés comme cela (char *pGCS = "40000 caractères...") ou bien ils proviennent par exemple de la lecture d'un fichier ou que sais je encore.

    Ma question, c'est pour savoir si ces 40000 caractères sont vraiment constant ou bien s'il sont devenus constants en passant dans une fonction ou pour les besoins de la démo (j'espère être clair mais c'est pas sûr)
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  9. #9
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Cela veut dire quoi "Les caractères de séparation sont surchargés, leur identité est donc perdue." ?
    Si je ne dis pas de bêtises, cela veut dire qu'on ne peut pas faire la différence entre deux caractères séparateurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        char chaine[256] = "A+B-C";
        char separateur[] = "+-";
        char * pTemp = strtok(chaine, separateur);
    Il est impossible de savoir après coup si la chaine analysée était "A+B+C", "A+B-C", "A-B+C" ou "A-B-C".

  10. #10
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Cela veut dire quoi "Les caractères de séparation sont surchargés, leur identité est donc perdue." ?
    Citation Envoyé par mabu Voir le message
    Si je ne dis pas de bêtises, cela veut dire qu'on ne peut pas faire la différence entre deux caractères séparateurs :
    Drôle de manière (un peu incompréhensible?) de le dire
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  11. #11
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Drôle de manière (un peu incompréhensible?) de le dire
    En fait, j'ai compris cette phrase le jour où j'ai justement voulu faire la différence entre deux séparateurs...

  12. #12
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Re ram-0000,

    en fait, je reçois un message sur un pointeur et je dois extraire une partie ( qui peut atteindre 400000 charactères), cette opération est faite à l'aide d'une fonction qui me donne en sortie un pointeur (pGCX) contenant la partie voulue.

  13. #13
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Il faut voir une chose, c'est que strtok() va modifier la chaine de caractères que tu lui fournies en entrée.

    Donc soit tu as besoin de la conserver intacte pour d'autre traitements ultérieures et alors il faut dupliquer cette chaine,

    Soit tu n'en as plus besoin et tu peux te permettre de laisser strtok() modifier cette chaine et donc pas de duplication nécessaire.

    Autre chose, je ne sais pas si cela te concerne mais strtok() n'est pas multithread. C'est à dire que si tu commence dans un thread, tout le reste du parsing doit être fait dans le même thread, interdit de sous traiter :-)
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  14. #14
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci ram-000, je crois qu'il vaut mieux que je trouve un autre moyen de découper la phrase.

  15. #15
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Je ne comprends pas dans le man:

    Cela veut dire quoi "Les caractères de séparation sont surchargés, leur identité est donc perdue." ?
    C'est mal rédigé (traduction à la hache, comme d'hab, toujours préférer la V.O...).

    Ça signifie que la chaine originelle est modifiée (overwritten ou 'écrite par-dessus'). Les séparateurs sont remplacés par des 0.
    Pas de Wi-Fi à la maison : CPL

  16. #16
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Ça signifie que la chaine originelle est modifiée (overwritten ou 'écrite par-dessus'). Les séparateurs sont remplacés par des 0.
    OK, je comprend mieux maintenant !!
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  17. #17
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    sinon c'est pas trop compliqué de se faire son MyStrtok
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

Discussions similaires

  1. [ImageMagick] La fonction imagettftext() ne marche pas ?
    Par supergrey dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 05/08/2007, 19h59
  2. fonction qui ne marche pas
    Par Donatelli dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 30/07/2007, 14h03
  3. Fonction qui ne marche pas
    Par GTJuanpablo dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 14/07/2007, 18h41
  4. Fonction qui ne marche pas sous FireFox
    Par Foudébois dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 17/11/2006, 14h35
  5. [Forum] Fonction mail() ne marche pas chez OVH ?
    Par quanou dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 8
    Dernier message: 08/11/2005, 13h11

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