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 :

erreur de segmentation


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 102
    Par défaut erreur de segmentation
    bonjour a tous

    j'ai une erreur de segmentation si quelqu'un pouvait me dire ou elle se trouve

    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
    int main(int argc, char *argv[])
    {
     
    char *decoupe[25];
    char *delimiteur;
    int a;
    char  lit_geo[100];
     
    strcpy(lit_geo,"25;50;100;150;156;123");
    delimiteur = ";" ; 
     
     
     
      a=0;
      decoupe[a] = strtok (lit_geo, delimiteur);
     
       while (delimiteur != NULL) 
      { 
         a++;
         decoupe[a]= strtok (NULL, delimiteur); 
      } 
     
     
    return 0;
    }

  2. #2
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    La condition de sortie de la boucle while est plus que douteuse....
    Il faut arrêter de programmer au hasard comme dise certain.....

  3. #3
    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
    délimiteur n'est jamais NULL puisque tu l'as assigné, ce n'est pas sur delimiteur qu'il faut faire le while....

    Une relecture de strtok s'impose...

    http://www.opengroup.org/onlinepubs/...ns/strtok.html

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      char *p=NULL ;
     
      a=0;
      p = strtok (lit_geo, delimiteur);
     
       while (p != NULL) 
      { 
         decoupe[a] = strdup(p) ;
         a++;
         p = strtok (NULL, delimiteur); 
      }

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Citation Envoyé par souviron34

    Une relecture de strtok s'impose...

    http://www.opengroup.org/onlinepubs/...ns/strtok.html
    N'y aurait-il pas une faute dans le code qui est proposé à cette URL ?

    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
     
    #include<stdio.h>
    #include<stdlib.h>
    #include <string.h>
     
    int main(void)
    {
    char *token;
    char * line = "LINE TO BE SEPARATED";
    char *search = " ";
     
    /* Token will point to "LINE". */
    token = strtok(line, search);
     
    /* Token will point to "TO". */
    token = strtok(NULL, search);
     
    return 0;
    }
    me renvoie un segmentation fault, en revanche

    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
     
    #include<stdio.h>
    #include<stdlib.h>
    #include <string.h>
     
    int main(void)
    {
    char *token;
    char line[] = "LINE TO BE SEPARATED";
    char *search = " ";
     
    /* Token will point to "LINE". */
    token = strtok(line, search);
     
    /* Token will point to "TO". */
    token = strtok(NULL, search);
     
    return 0;
    }
    renvoie

    token = LINE
    line = LINE
    search =
    token = TO
    line = LINE
    search =
    c'est la première fois que je vois la fonction strtok(). J'apprends donc à l'utiliser...

  5. #5
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Citation Envoyé par salseropom
    N'y aurait-il pas une faute dans le code qui est proposé à cette URL ?

    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
     
    #include<stdio.h>
    #include<stdlib.h>
    #include <string.h>
     
    int main(void)
    {
    char *token;
    char * line = "LINE TO BE SEPARATED";
    char *search = " ";
     
    /* Token will point to "LINE". */
    token = strtok(line, search);
     
    /* Token will point to "TO". */
    token = strtok(NULL, search);
     
    return 0;
    }
    me renvoie un segmentation fault, en revanche

    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
     
    #include<stdio.h>
    #include<stdlib.h>
    #include <string.h>
     
    int main(void)
    {
    char *token;
    char line[] = "LINE TO BE SEPARATED";
    char *search = " ";
     
    /* Token will point to "LINE". */
    token = strtok(line, search);
     
    /* Token will point to "TO". */
    token = strtok(NULL, search);
     
    return 0;
    }
    renvoie



    c'est la première fois que je vois la fonction strtok(). J'apprends donc à l'utiliser...
    C'est écrit noir sur blanc dans le manuel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    é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. 
    
    La fonction strtok() utilise un buffer statique et n'est donc pas sûre dans un contexte multithread. Dans ce cas il vaut mieux utiliser strtok_r().

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Citation Envoyé par crocodilex
    C'est écrit noir sur blanc dans le manuel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    é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. 
    
    La fonction strtok() utilise un buffer statique et n'est donc pas sûre dans un contexte multithread. Dans ce cas il vaut mieux utiliser strtok_r().
    OK... ça répond à ma question. Merci

  7. #7
    Membre chevronné
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Par défaut
    Hello,

    Citation Envoyé par salseropom
    N'y aurait-il pas une faute dans le code qui est proposé à cette URL ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char * line = "LINE TO BE SEPARATED";
    /* Token will point to "LINE". */
    token = strtok(line, search);
    me renvoie un segmentation fault, en revanche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char line[] = "LINE TO BE SEPARATED";
    /* Token will point to "LINE". */
    token = strtok(line, search);
    Héhé, bien vu. En effet, un pointeur vers char initialisé par une chaîne littérale (cas 1) peut être placée dans une zone mémoire protégée en écriture par le compilateur. Or que fait cette (maudite) fonction strtok () ? Hé bien elle s'amuse à modifier ce qui lui a été passé comme 1er argument, c'est à dire la chaine à découper, pour garder un pointeur vers le token suivant. Donc ici, boum. Dans le second cas, il s'agit d'un tableau modifiable, pas de problème.

    De toute façon, l'exemple est mal choisi car strchr() est plus approprié dans le cas d'un seul délimiteur, de même qu'il est conseillé d'utiliser strtok_r() à la place de strtok().

    A+

  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
    Citation Envoyé par Foobar1329
    ..
    De toute façon, l'exemple est mal choisi car strchr() est plus approprié dans le cas d'un seul délimiteur...
    Absolument, je ne faisais que répondre au PO.

    Quant à strtok, ce n'est pas du tout déconseillé... Tout depend de l'usage.. Et effectivement elle modifie la chaîne, mais en remplaçant les délimiteurs par des '\0' ... Donc à n'utiliser QUE si on veut plus se servir de la chaîne après...

    Par contre, une chose à faire dans tout programme "complexe" est de se faire sa propre fonction GetToken, sans modifier la chaîne, en passant en argument un pointeur char **, et un pointeur int* qui donnent respectivement le morceau de phrase et l'indice où on la trouve.. et qui, fonctionnant par realloc, libère au fur et à mesure le token..

Discussions similaires

  1. Erreurs de segmentation !
    Par anti-conformiste dans le forum Applications et environnements graphiques
    Réponses: 16
    Dernier message: 18/10/2005, 11h11
  2. Erreur de segmentation
    Par Trunks dans le forum C
    Réponses: 3
    Dernier message: 06/10/2005, 18h28
  3. Erreur de segmentation (Inconnue)
    Par Dark-Meteor dans le forum C
    Réponses: 5
    Dernier message: 08/09/2005, 13h42
  4. [Dev-C++] Erreur de segmentation...
    Par sas dans le forum Dev-C++
    Réponses: 11
    Dernier message: 26/03/2005, 14h25
  5. erreur de segmentation
    Par transistor49 dans le forum C++
    Réponses: 10
    Dernier message: 15/03/2005, 11h18

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