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 :

segmentation fault lors de l'utilisation de strcpy


Sujet :

C

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 89
    Par défaut segmentation fault lors de l'utilisation de strcpy
    bonjours
    en fait j ai un fichier qui contient bonjour toto
    comment va tu
    ok


    j ai bie lis ce fichier ligne par ligne,aprés je voudri le stocké dans un tableau[][]
    j ai utulisé la fonction strcpy()
    la ligne ou il ya cette fonction j ai 2 erreurs warning ,
    voila le code
    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
    #include<stdio.h>
    #include<stdlib.h>
    #define TAILLE_MAX 1000 // Tableau de taille 1000
    #define TAILLE_LIG 9999 //Nombre MAXIMUM DE LIGNE ds un fichier
    #define TAILLE_COL 999//Nombre maximum de coloonne ds un fichier
    int main(int argc, char *argv[])
    {
        int i;
        char tableau[TAILLE_LIG][TAILLE_COL];
        FILE* fichier = NULL;
        char chaine[TAILLE_MAX] = ""; // Chaîne vide de taille TAILLE_MAX
     
        fichier = fopen("test.txt", "r");
     
        if (fichier != NULL)
        {
            while((fgets(chaine, TAILLE_MAX, fichier)!=NULL)&&i<TAILLE_LIG) // On lit maximum TAILLE_MAX caractères du fichier, on stocke le tout dans "chaine"
    {        
     
    	printf("%s", chaine); // On affiche la chaîne
    	strcpy(tableau,chaine);
    i++;
     }
            fclose(fichier);
        }
     
        return 0;
    }
    Cordialement

  2. #2
    Membre expérimenté Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Par défaut
    Vous vouliez sans doute faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy(tableau[i],chaine);

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 89
    Par défaut
    Citation Envoyé par quetzacoatl Voir le message
    Vous vouliez sans doute faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy(tableau[i],chaine);
    merci pour votre intervention mais il tableau est un tablo de deux dimention

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    C'est bien parce que c'est un tableau à 2 dimensions que quetzacoatl propose la forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy(tableau[i],chaine);

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 89
    Par défaut
    Citation Envoyé par diogene Voir le message
    C'est bien parce que c'est un tableau à 2 dimensions que quetzacoatl propose la forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy(tableau[i],chaine);
    ca marche pas ,toujours un warning et segmentationfault

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par simplyc 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #include<stdio.h>
    #include<stdlib.h>
    #define TAILLE_MAX 1000 // Tableau de taille 1000
    #define TAILLE_LIG 9999 //Nombre MAXIMUM DE LIGNE ds un fichier
    #define TAILLE_COL 999//Nombre maximum de coloonne ds un fichier
    int main(int argc, char *argv[])
    {
        int i;;
        char tableau[TAILLE_LIG][TAILLE_COL];
        FILE* fichier = NULL;
        char chaine[TAILLE_MAX] = ""; // Chaîne vide de taille TAILLE_MAX
     
        fichier = fopen("test.txt", "r");
     
        if (fichier != NULL)
        {
            while((fgets(chaine, TAILLE_MAX, fichier)!=NULL)&&i<TAILLE_LIG) // On lit maximum TAILLE_MAX caractères du fichier, on stocke le tout dans "chaine"
    	{        
    
    		printf("%s", chaine); // On affiche la chaîne
    		strcpy(tableau[i],chaine);
    		i++;
    	}
            fclose(fichier);
        }
    
        return 0;
    }
    ca marche pas ,toujours un warning et segmentationfault
    Je ne vois nulle part, dans ton code, d'initialisation pour "i"...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    C'est normal que ça plante : regarde la taille de ton tableau, il explose la pile. Il faut faire de l'allocation dynamique (ou bien beaucoup diminuer TAILLE_LIG).

    Trois autres problèmes :
    1) "i" n'est pas initialisé.
    2) Il faut inclure le fichier "string.h".
    3) TAILLE_MAX et TAILLE_COL n'ont pas la même taille. C'est susceptible de générer un bug. Si le '\0' se trouve à la 1000è position de "chaine", la copie fera déborder la ligne du tableau "tableau" (ie. le '\0' se retrouvera en début de ligne suivante).

    Le compilateur, s'il est bien réglé, doit obligatoirement signaler les deux premiers problèmes.

    En outre, il est préférable d'éliminer l'éventuel '\r' ou '\n' après avoir rempli le buffer "chaine" (en le remplaçant par '\0').

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 89
    Par défaut
    Citation Envoyé par jeroman Voir le message
    C'est normal que ça plante : regarde la taille de ton tableau, il explose la pile. Il faut faire de l'allocation dynamique (ou bien beaucoup diminuer TAILLE_LIG).

    Trois autres problèmes :
    1) "i" n'est pas initialisé.
    2) Il faut inclure le fichier "string.h".
    3) TAILLE_MAX et TAILLE_COL n'ont pas la même taille. C'est susceptible de générer un bug. Si le '\0' se trouve à la 1000è position de "chaine", la copie fera déborder la ligne du tableau "tableau" (ie. le '\0' se retrouvera en début de ligne suivante).

    Le compilateur, s'il est bien réglé, doit obligatoirement signaler les deux premiers problèmes.

    En outre, il est préférable d'éliminer l'éventuel '\r' ou '\n' après avoir rempli le buffer "chaine" (en le remplaçant par '\0').
    oui vous avez raison l eurreur de de segmentation vient de la depassement de memoire ,en fait l allocation dynamique et les pointeurs sont le bete noire pour moi
    j ai encore une autre pobleme quand j ai fait printf("%s",tableau[1][0] ) je retrouve un erreur par contre printf("%c",tableau[1][1] ) ca marche
    par contre il m affiche un caractere
    par exp toto ca va
    non et toi
    l affichage a ce cas 'o' et moi je voudrai "et"
    voila le neauveau code
    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
    #include<stdio.h>
    #include<stdlib.h>
    #include"string.h"
    #define TAILLE_MAX 9 // Tableau de taille 1000
    #define TAILLE_LIG 9 //Nombre MAXIMUM DE LIGNE ds un fichier
    #define TAILLE_COL 9//Nombre maximum de coloonne ds un fichier
    int main(int argc, char *argv[])
    {
        int i=0;
        char tableau[TAILLE_LIG][TAILLE_COL];
        FILE* fichier = NULL;
        char chaine[TAILLE_MAX] = ""; // Chaîne vide de taille TAILLE_MAX
     
        fichier = fopen("test.txt", "r");
     
        if (fichier != NULL)
        {
            while((fgets(chaine, TAILLE_MAX, fichier)!=NULL)&&i<TAILLE_LIG) // On lit maximum TAILLE_MAX caractères du fichier, on stocke le tout dans "chaine"
    {        
     
    	printf("%s", chaine); // On affiche la chaîne
    	strcpy(tableau[i],chaine);
     
    i++;
     }
    printf("%c\n",tableau[1][1]);
            fclose(fichier);
        }
     
        return 0;
    }
    cordialement

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Il ne faut pas non plus passer d'un extrême à l'autre. Vos lignes (dans test.txt) font plus de 9 caractères, elles seront segmentées en plusieurs bouts (i.e. en plusieurs lignes dans le tableau).

    Il faut utiliser < >

    j ai encore une autre pobleme quand j ai fait printf("%s",tableau[1][0] ) je retrouve un erreur
    Normal que ça crashe. La fonction attend une adresse en argument, pas un caractère.

    par contre il m affiche un caractere
    par exp toto ca va
    non et toi
    l affichage a ce cas 'o' et moi je voudrai "et"
    Essayez de vous exprimer plus clairement. Je n'ai rien compris.

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 89
    Par défaut
    Citation Envoyé par jeroman Voir le message
    Il ne faut pas non plus passer d'un extrême à l'autre. Vos lignes (dans test.txt) font plus de 9 caractères, elles seront segmentées en plusieurs bouts (i.e. en plusieurs lignes dans le tableau).

    Il faut utiliser < >

    Normal que ça crashe. La fonction attend une adresse en argument, pas un caractère.

    Essayez de vous exprimer plus clairement. Je n'ai rien compris.
    en fait j ai un fichier qui contient salut toto
    ca va
    non et toi

    aprés que je rajoute le contenu de fichier dans le tableau
    je voudrai maintennat voir ce qui est dedans
    comment je peux recuperer la chaine "et"

  11. #11
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par simplyc Voir le message
    aprés que je rajoute le contenu de fichier dans le tableau
    Et pourquoi tu fais ça ? Tu as déjà les infos dans le fichier. Pourquoi tiens-tu absolument à le mettre dans ton tableau ?
    Si t'as 15 euros dans la poche droite et que tu as besoin de 3 euro, est-ce que tu commences par tout mettre dans la poche gauche ???

    Donc voilà. La mémoire c'est pas infini. Tu as ton fichier, tu le parcours ligne à ligne et dès qu'une ligne correspond à ce que tu attends ben tu fais un traitement dessus. Et s'il faut refaire ensuite un nouveau traitement ben tu te replaces au début et tu recommence l'autre traitement...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 89
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Et pourquoi tu fais ça ? Tu as déjà les infos dans le fichier. Pourquoi tiens-tu absolument à le mettre dans ton tableau ?
    Si t'as 15 euros dans la poche droite et que tu as besoin de 3 euro, est-ce que tu commences par tout mettre dans la poche gauche ???

    Donc voilà. La mémoire c'est pas infini. Tu as ton fichier, tu le parcours ligne à ligne et dès qu'une ligne correspond à ce que tu attends ben tu fais un traitement dessus. Et s'il faut refaire ensuite un nouveau traitement ben tu te replaces au début et tu recommence l'autre traitement...
    j ai besoin de la la ligne et de la colonne

  13. #13
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par simplyc Voir le message
    j ai besoin de la la ligne et de la colonne
    Ben la ligne tu l'as au moment où tu la lis. Parce que si tu lis une ligne qui ne convient pas ben t'as pas tellement besoin de la garder non ???
    Et la colonne (la lettre donc ?) ben tu la récupères en traitant la ligne quand tu la chopes...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  14. #14
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 89
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ben la ligne tu l'as au moment où tu la lis. Parce que si tu lis une ligne qui ne convient pas ben t'as pas tellement besoin de la garder non ???
    Et la colonne (la lettre donc ?) ben tu la récupères en traitant la ligne quand tu la chopes...
    c est pas ca
    j ai le fichier test.txt qui contient
    salut toto
    ca va
    j ai besoin de recuperer "va"
    printf("%c",tablo[1][1]) affiche "a" c est pas ca normalement

  15. #15
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Qia,
    Citation Envoyé par simplyc Voir le message
    c est pas ca
    j ai le fichier test.txt qui contient
    salut toto
    ca va
    j ai besoin de recuperer "va"
    printf("%c",tablo[1][1]) affiche "a" c est pas ca normalement
    Si, c'est ça.

    tablo[1] contient ca va, donc tablo[1][1] == "a".

    J'ai l'impression qu'il faut que tu retournes étudier les chaînes de caractères en C.

  16. #16
    Membre expérimenté Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Par défaut
    Etant donné que
    #define TAILLE_MAX 9
    ça m'étonnerait que vous ayez "a", vous n'auriez pas plutôt "o"?

  17. #17
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par simplyc Voir le message
    c est pas ca
    j ai le fichier test.txt qui contient
    salut toto
    ca va
    j ai besoin de recuperer "va"
    Ben t'as pas besoin de tout stocker !!! Te suffit de faire un traitement
    => soit sur la ligne
    Tu lis la ligne
    si ligne = "ça va" alors tu affiche ce qui va bien
    tu passes à la ligne suivante

    => soit sur le n° de ligne
    Tu initialises un compteur
    Tu lis la ligne
    Tu incrémentes le compteur
    si cpt=2 alors tu affiche ce qui va bien
    tu passes à la ligne suivante

    Citation Envoyé par quetzacoatl Voir le message
    Etant donné que
    ça m'étonnerait que vous ayez "a", vous n'auriez pas plutôt "o"?
    Ah bien vu ! Effectivement, le premier fgets() ne récupère que 8 lettres soit le "salut to" et le second fgets() récupère la fin de la ligne soit "to"
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  18. #18
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 89
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ben t'as pas besoin de tout stocker !!! Te suffit de faire un traitement
    => soit sur la ligne
    Tu lis la ligne
    si ligne = "ça va" alors tu affiche ce qui va bien
    tu passes à la ligne suivante

    => soit sur le n° de ligne
    Tu initialises un compteur
    Tu lis la ligne
    Tu incrémentes le compteur
    si cpt=2 alors tu affiche ce qui va bien
    tu passes à la ligne suivante



    Ah bien vu ! Effectivement, le premier fgets() ne récupère que 8 lettres soit le "salut to" et le second fgets() récupère la fin de la ligne soit "to"
    excuse moi
    je ne rien compris

  19. #19
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par simplyc Voir le message
    excuse moi
    je ne rien compris
    T'as rien compris à quelle partie ???
    Partie 1: tu n'es pas obligé de stocker toutes les lignes du fichier alors que tu n'en veux qu'une seule => tu stockes juste celle qui t'intéresse

    Partie 2: ton fichier contient "salut<espace>toto<return>ca<espace>va<return>" (tu remarques que je le décris dans sa réalité la plus basique, car ce bel affichage ligne par ligne n'est que la façon dont ton éditeur te l'affiche à l'écran...
    Donc tu fais un fgets(..., 9, fp) => fgets() s'arrête quand n-1 caractères ont été lus ou bien lorsqu'il trouve un <return>. Tu en demandes 9, il t'en donne 8 => "salut<espace>to". Puis à la boucle suivante, tu en redemandes 9, là il s'arrête au <return> => "to<return>"
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Segmentation Fault lors de mise à jour d'image par callback
    Par bboy_keen dans le forum GTK+ avec C & C++
    Réponses: 7
    Dernier message: 07/12/2010, 00h16
  2. segmentation fault lors d'un pthread_create
    Par Anouschka dans le forum POSIX
    Réponses: 2
    Dernier message: 09/06/2010, 17h53
  3. erreur "Segmentation Fault" lors de l'import d'un dump
    Par farenheiit dans le forum Import/Export
    Réponses: 13
    Dernier message: 28/11/2007, 10h17
  4. PB segmentation fault lors d'installation RPM
    Par Asce_ dans le forum RedHat / CentOS / Fedora
    Réponses: 3
    Dernier message: 06/11/2007, 11h22
  5. Strcpy et segmentation fault...
    Par laurent_ifips dans le forum C
    Réponses: 15
    Dernier message: 11/12/2005, 11h23

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