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 :

Fonctionnement de strok


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Par défaut [Résolu] Fonctionnement de strok
    Bonsoir,

    Je cherche à recoder la fonction strtok, cependant je ne comprends pas son principe.

    Dans un premier temps, il cherche le premier séparateur dans la chaine et le remplace par un '\0'. Jusqu'à là, ok, mais c'est ce qui suis que je ne comprends pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ptr = strtok(NULL, sep);
    Je ne vois pas comment cette fonction peut manipuler la chaine sur laquelle je travaillais précédemment. Comment un pointeur NULL peut-il pointer vers la cellule qui se trouve juste après le '\0' que la fonction a placé avec l'appel précédente? Est-ce une histoire de bufferisation?

    Bref, je suis perdu. Merci pour votre aide.

  2. #2
    Expert éminent

    Avatar de Anomaly
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 379
    Billets dans le blog
    1
    Par défaut
    En fait, strtok() utilise une variable globale interne qui pointe vers l'élément suivant. Quand tu lui passes NULL, il sait alors que tu continues d'examiner une chaîne que tu as commencée avec un autre strtok et donc consulte (et met à jour) cette variable.

    C'est une des raisons de la mauvaise réputation de strtok()

  3. #3
    Membre éclairé Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Par défaut
    Merci de ton explication.

    Je vais voir comment je peux faire alors

  4. #4
    Expert éminent

    Avatar de Anomaly
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 379
    Billets dans le blog
    1
    Par défaut
    Je ne sais pas trop quel est ton but dans l'affaire, mais tu n'es pas obligé de reproduire ce défaut de strtok(). Parce qu'utiliser une variable globale est un défaut, cela t'interdit de traiter plusieurs chaînes en même temps (et dans un contexte multithread, ça fait mal ).

    POSIX définit une fonction améliorée strok_r() (page manuel) qui prend un paramètre supplémentaire : un pointeur vers une variable pointeur. Cette variable, tu la passes à tous tes appels de strtok_r() qui concernent la même chaîne, et strtok_r() modifie alors le pointeur pointé par cette variable à la place de modifier une variable globale (cela fonctionne un peu comme un descripteur de fichier). Ainsi le principal inconvénient de strtok(), qui est l'impossibilité de traiter plusieurs chaînes à la fois, est levé.

    L'autre grand inconvénient de strtok() et qui reste dans strtok_r() est le fait que la chaîne source est détruite (vu que des caractères nuls sont insérés dans la chaîne). A toi de voir si ça vaut le coup de trouver une solution à cet autre problème. Bon courage

  5. #5
    Membre éclairé Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Par défaut
    Merci pour toutes ces infos !

  6. #6
    Membre éclairé Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Par défaut
    Voilà, grace à tes infos, j'ai réussi à recoder le strtok :

    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
    34
    35
    36
    37
    38
    39
    40
    41
     
    char *strtok(char *s1, const char *s2)
    {
      char *tmp;
     
      if (s1 != NULL)
      {
        if (strcspn(s1, s2) != strlen(s1))
        {
          s1[strcspn(s1, s2)] = '\0';
     
          g_strtok_p = &s1[strcspn(s1, s2) + 1];
        }
        else
          g_strtok_p = NULL;
     
        return s1;
      }
      else
      {
        if (g_strtok_p != NULL)
        {
          tmp = g_strtok_p;
     
          if (strcspn(g_strtok_p, s2) != strlen(g_strtok_p))
          {
            g_strtok_p[strcspn(g_strtok_p, s2)] = '\0';
     
            g_strtok_p = &g_strtok_p[strcspn(g_strtok_p, s2) + 1];
          }
          else
            g_strtok_p = NULL;
     
          return tmp;
        }
        else
          return NULL;
      }
     
      return tmp;
    }
    En fait, je recode toutes les fonctions de string.h pour m'entraîner. Je ferai des choses un peu plus compliquées par la suite (liste doublement chaînées, arbres n-aires, théorème MinMax, ...).

    Merci encore pour ton explication

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/06/2003, 16h51
  2. Réponses: 5
    Dernier message: 14/05/2003, 14h51
  3. [Turbo Pascal] TP7 fonctionne en QWERTY
    Par callahan dans le forum Turbo Pascal
    Réponses: 9
    Dernier message: 08/02/2003, 21h49
  4. Prb de fonctionnement dans SaveDialog avecInitialDir
    Par boyerf dans le forum Composants VCL
    Réponses: 4
    Dernier message: 12/12/2002, 21h46
  5. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 00h10

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