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 :

comportement de la fonction strtok()


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 11
    Points : 12
    Points
    12
    Par défaut comportement de la fonction strtok()
    Je ne comprends pas pourquoi ce bout de code ne marche pas (Erreur de segmentation).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      char *str ="- This, a sample string.";
      char * pch;
      printf ("Splitting string \"%s\" into tokens:\n",str);
      pch = strtok (str," ,.-");
      while (pch != NULL)
      {
        printf ("%s\n",pch);
        pch = strtok (NULL, " ,.-");
      }
    C'est la même chose que ce qu'il y a mais en changeant char str[] en char *str. Je pensais que c'était la même chose, les pointeurs et les tableaux...

    Le code original :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      char str[] ="- This, a sample string.";
      char * pch;
      printf ("Splitting string \"%s\" into tokens:\n",str);
      pch = strtok (str," ,.-");
      while (pch != NULL)
      {
        printf ("%s\n",pch);
        pch = strtok (NULL, " ,.-");
      }
    En fait il faudrait que je fasse passer un pointeur vers une chaîne en paramètre (comme rvalue de str=...). Ça donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      char *str;
      strcpy(str,nomFichier);
      char * pch;
      printf ("Splitting string \"%s\" into tokens:\n",str);
      pch = strtok (str," ,.-");
      while (pch != NULL)
      {
        printf ("%s\n",pch);
        pch = strtok (NULL, " ,.-");
      }
    Et là, c'est à peine mieux :

    Splitting string "../data/video/campus_raw.AVI" into tokens:
    1
    /data/video/campus_raw
    2
    AVI
    Erreur de segmentation (core dumped)

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Points : 219
    Points
    219
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *str ="- This, a sample string.";
    Ici tu initialises la valeur de str avec l'adresse d'une string située dans une zone de la mémoire qui est en lecture seule, c'est pour cela que tu as un seg fault.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char str[] ="- This, a sample string.";
    Ici c'est différent. Tu crées un tableau dont chaque case va être initialisée avec les caractères de la string (c'est le compilateur qui s'occupe d'allouer la bonne taille et qui va réaliser l'initialisation). Tu peux alors modifier le contenu du tableau sans aucun problème (ce que fait strtok).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char *str;
    strcpy(str,nomFichier);
    Là tu n'initialise pas str donc il pointe n'importe où et quand tu utilise strcpy ça plante.

  3. #3
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 11
    Points : 12
    Points
    12
    Par défaut
    Comment on fait pour copier le contenu d'une chaîne dans ce cas ?

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Points : 219
    Points
    219
    Par défaut
    Citation Envoyé par Arronax Voir le message
    Comment on fait pour copier le contenu d'une chaîne dans ce cas ?
    Il faut que tu alloues un bloc mémoire suffisamment grand pour pouvoir y copier la chaine. Ensuite tu initialises ton pointeur avec l'adresse du début de la zone mémoire allouée.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char *str=new char[strlen(NomFichier)+1];
    strcpy(str, NomFichier);
    (à noter que dans le fragment de code que je t'ai donné il manque la gestion des exceptions et la libération de la mémoire)
    Ceci étant dit si tu veux vraiment faire du C++ (car ton code c'est du C pas du C++) utilise plutôt les std::string, cela t'épargneras bien des soucis.

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

Discussions similaires

  1. fonction strtok manquante
    Par Bayard dans le forum C
    Réponses: 3
    Dernier message: 10/06/2007, 12h34
  2. [NASM] Programmation fonction strtok
    Par moustiks dans le forum Assembleur
    Réponses: 4
    Dernier message: 15/01/2007, 09h30
  3. Fonction strtok
    Par benjiprog dans le forum C
    Réponses: 7
    Dernier message: 21/03/2006, 20h38
  4. Fonction strtok et récupération des fragments
    Par GarGamel55 dans le forum Langage
    Réponses: 7
    Dernier message: 18/02/2006, 19h27
  5. du mal à comprendre la fonction strtok
    Par thierry_b dans le forum C
    Réponses: 2
    Dernier message: 25/11/2005, 10h37

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