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 et concaténation


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    252
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Par défaut Erreur de segmentation et concaténation
    Bonjour à tous,
    j'essaie de concaténer trois chaînes de caractères tel que je puisse obtenir:
    Image_XX.ppm

    mon code est le suivant:

    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
     
    char* s1 = "Image_";
       char* s2 = (char*)num;
       char* s3 = ".ppm";
       char* s4 = NULL;
       char* nom_image=NULL;
       s4 = malloc (strlen (s1) + strlen (s2) + 1);
       s4 = strcat(s1,s2);
       printf("%s",s4);
       nom_image = malloc (strlen (s4) + strlen (s3) + 1);
       nom_image = strcat(s4,s3);
       printf("%s",nom_image);
     
    printf("En cours d'ecriture de l'image...\n");
    fp = fopen(nom_image, "w");
    Le problème, c'est qu'il me renvoie une erreur du type: erreur de segmentation
    je ne comprends pas l'erreur...
    Quelqu'un saurait-il ce qui cloche dans mon code?
    Merci
    Bonne journée

  2. #2
    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
    Salut, quand tu fais

    tu colles à la fin de s1 la string s2. Mais ta string s1 n'a pas suffisament d'espace pour contenir la string s2 à sa suite d'où ton segmentation fault.

    Je te propose la chose suivante (non testée) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    char* s1 = "Image_";
       char* s2 = (char*)num;
       char* s3 = ".ppm";
       char s4[strlen(s1)+strlen(s2)+strlen(s3)+10];
       strcat(s4,s1);
      strcat(s4,s2);
      strcat(s4,s3);
       printf("%s",s4);
       char * nom_image = strdup(s4);
       printf("%s",nom_image);
    n'oublie pas de faire un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    free(mon_image); mon_image=NULL;
    et n'oublie pas qu'après un appel à malloc, il faut vérifier que ton pointeur ne soit pas NULL

  3. #3
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    252
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Par défaut
    Je débute en C, ca sert à quoi les dernières lignes de code (le free et remettre image à null)?

  4. #4
    Membre confirmé Avatar de scorpion.os
    Homme Profil pro
    Chef de projet Cobol/AS400
    Inscrit en
    Mai 2006
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet Cobol/AS400

    Informations forums :
    Inscription : Mai 2006
    Messages : 159
    Par défaut
    le "free" c pour liberer la memoire que tu as allouer avec "malloc"

  5. #5
    Membre confirmé Avatar de scorpion.os
    Homme Profil pro
    Chef de projet Cobol/AS400
    Inscrit en
    Mai 2006
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet Cobol/AS400

    Informations forums :
    Inscription : Mai 2006
    Messages : 159
    Par défaut
    deja,tu dois convertir ce que malloc te renvoi.
    ecri ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    s4 = (char* ) malloc (strlen (s1) + strlen (s2) + 1);
    c ar s4 est de type char *

  6. #6
    Membre Expert Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    Citation Envoyé par scorpion.os
    deja,tu dois convertir ce que malloc te renvoi.
    ecri ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    s4 = (char* ) malloc (strlen (s1) + strlen (s2) + 1);
    c ar s4 est de type char *
    Justement non, il ne faut pas convertir le retour de malloc.
    Pour apprendre à utiliser correctement malloc(), cf. l'excellent site d'Emmanuel : http://emmanuel-delahaye.developpez....tes.htm#malloc

    Cela dit, ton code initial semble trop compliqué. Pourquoi n'utilises-tu pas sprintf(), ou, mieux, snprintf() ?
    Par exemple, comme ça :
    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
    int main(void)
    {
        const char* num = "123";
        char* nom_image = NULL;
        int longueur = 11+strlen(num);
     
        nom_image = malloc(longueur);
        if (nom_image == NULL) {
            perror("Erreur sur malloc");
            exit(EXIT_FAILURE);
        }
        memset(nom_image, '\0', sizeof(nom_image));
     
        snprintf(nom_image, longueur, "Image_%s.ppm", num);
     
        printf("nom_image = '%s'\n",nom_image);
     
        free(nom_image); nom_image = NULL;
     
        exit(EXIT_SUCCESS);
    }

  7. #7
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    252
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 252
    Par défaut
    Je sais pas, ca marche toujours pas, je vois pas d'ou vient l'erreur (j'ai essayé le code tel quel)....

    Même en donnant le type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    s4 = (char*)malloc (strlen (s1) + strlen (s2) + 10);
    Ca ne marche pas non plus

Discussions similaires

  1. Erreur de segmentation sur une concaténation
    Par cypher.sephiroth dans le forum Débuter
    Réponses: 14
    Dernier message: 18/08/2009, 17h42
  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