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 :

Problème avec strtok


Sujet :

C

  1. #1
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut Problème avec strtok
    Bonjour à tous, je réalise une petite application mais je bloque à un endroit tout bête. J'ai deux applications : une qui envoie des commandes et l'autre qui recoit.
    J'aimerais que l'utilisateur 1 (serveur) envoi par exemple :

    ACT_DIR>C:\Program Files\SamSoft

    Et que le client traite ceci en décomposant la chaine recue en deux :

    ACT_DIR et C:\Program Files\SamSoft

    J'ai trouvé la fonction strtok

    Malheuresement, je n'arrive qu'à prendre ACT_DIR et pas le reste.

    Voilà mon code : (une toute partie )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    char serveurMessage[256], sep[] = ">";
    /* ... */
    char *partie1, *partie2;
    partie1 = strtok(serveurMessage,sep);
    fprintf(stdout, "Partie1:  %s\n", partie1);
    fflush(stdout);
    /*
    Pour la partie 2 j'ai testé plein de trucs 
    meme en regardant le man j'ai pas compris
    comment prendre l'autre partie
    */
    Merci d'avance

  2. #2
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    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
    #include <stdio.h>
    #include <string.h>
     
    int main (void)
    {
       char serveurMessage[256]= "ACT_DIR>C:\\Program Files\\SamSoft";
       char sep[] = ">";
     
       char *partie = strtok(serveurMessage,sep);
       do
       {
          puts(partie);
          partie = strtok(NULL, sep);
       }
       while(partie != NULL);
       return 0;
    }

  3. #3
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    Merci mais je sais déjà comment stocker la partie1. Je souhaite trouver un moyen pour prendre la partie située après le caractère >

    Merci d'avance

  4. #4
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    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
    #include <stdio.h>
    #include <string.h>
     
    int main (void)
    {
       char serveurMessage[256]= "ACT_DIR>C:\\Program Files\\SamSoft";
       char sep[] = ">";
     
       char *partie = strtok(serveurMessage,sep);
       char *partie2 = strtok(NULL, sep);
       if(partie2 != NULL)
       {
          puts(partie2);
       }
       return 0;
    }

  5. #5
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    J'avais pensé à cela mais rien n'y fait

    Serveur:
    com:> DIR>Test

    8 octet(s) envoye'(s)
    Client
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Donne'e recue avec succes
     
    Serveur 3 : 
    partie1 : DIR
    partie2 : (null)
    Merci d'avance

  6. #6
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Je me pose une question : si tu fais ça ça donne quoi?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char *partie = strdup(strtok(serveurMessage,sep));
       char *partie2 = strdup(strtok(NULL, sep));

  7. #7
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    Erreur de segmentation (core dumped)
    Tout simplement

  8. #8
    Expert confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       char sep[] = ">\n\r\t";
    sinon le code est correct..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    char *p, *p0 ;
     
    p0 = chaine ;
    while ( (p = strtok(p0, sep)) != NULL )
       {
             fprintf ( stderr, "\nchaine : (%s)", p );
             if ( p0 == chaine )
                p0 = NULL ;
       }

  9. #9
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    est tu sûr de la chaîne que tu reçoit? car de mon point de vue je pense qu'il n'y a rien après le '>'.
    Ou bien tu l'utilises sur une chaine constante?

  10. #10
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    Mes excuses en fait le serveur envoyait la chaine : "TRUC>test" mais lors de la récéption j'avais laissé trainer un morceau de code qui utilisait strtok au début en gros la chaine recue devenait : "TRUC"

    Ca marche : oui et non.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    char *p, *p0 ;
    p0 = serveurMessage ;
    while ( (p = strtok(p0, sep)) != NULL )
    {
        fprintf ( stderr, "\nchaine : (%s)", p );
        if (strcmp(p0, serveurMessage)==0)
                   p0 = NULL ;
    }
    Il m'affiche :

    Donne'e recue avec succes

    Serveur 3 : A>S

    chaine : (A)
    chaine : (S)Erreur de segmentation (core dumped)

    samsoft@samsoft-laptop:~/Programmes/C/mySock/Client$
    Merci d'avance

  11. #11
    Expert confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    normal

    ou as-tu vu que j'ai fais strcmp ???

    je compare les pointeurs, pas les chaines..

    tu peux faire ça si tu préfères :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if ( p0 != NULL )
      p0 = NULL ;

  12. #12
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    Ah mais oui, quel abruti je fais. Je croyais que c'était deux chaines de caractères et comme on ne compare pas deux chaines en utilisant == j'ai corrigé. Je me disais aussi avec votre experience, c'est pas normal une telle erreur.

    Mes excuses encore une fois

    Tout fonctionne !

    Merci à vous tous

    Résolu.

  13. #13
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    J'ai encore un gros problème

    Voilà mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    serveurMessage[sock_err] = 0;
    p = strtok(serveurMessage, sep);
    printf("ServeurMessage: %s\n", serveurMessage);
     
    while (p != NULL)
    { 
    p = strtok(NULL, sep);
    }
    part2 = p;
    fprintf(stdout, "p1: %s\np2: %s", p, part2);
    Voilà le résultat :

    Donne'e recue avec succes
    ServeurMessage: test
    p1: (null)
    p2: (null)
    Merci d'avance

    PS: Si j"utilise la technique que vous m'avez donné, ca marche mais moi je ne souhaite pas qu'afficher mais enregistrer les deux parties.

  14. #14
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    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
    #include <stdio.h>
    #include <string.h>
     
    int main (void)
    {
       char serveurMessage[256]= "ACT_DIR>C:\\Program Files\\SamSoft";
       char sep[] = ">";
     
       char *partie = strtok(serveurMessage,sep);
       char *partie2 = strtok(NULL, sep);
       if(partie2 != NULL)
       {
          puts(partie2);
       }
       return 0;
    }

  15. #15
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    La fatigue surement, je vois plus rien

    Merci pour tout, ca fonctionne !

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

Discussions similaires

  1. Problème avec fonction strtok
    Par zeeek dans le forum C
    Réponses: 2
    Dernier message: 23/01/2010, 09h33
  2. problème avec strtok()
    Par bigkentheone dans le forum Débuter
    Réponses: 4
    Dernier message: 07/01/2009, 00h55
  3. problème avec strtok
    Par gaufre21 dans le forum C
    Réponses: 2
    Dernier message: 08/05/2007, 02h15
  4. problème avec strtok pour récupérer les vides
    Par manikou dans le forum MFC
    Réponses: 4
    Dernier message: 02/06/2005, 20h08
  5. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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