Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C] Segmentation fault (core dumped)

o_O O_o

Sujet résolu
    24 janvier 2007 à 14:30:25

    Salut! :)

    J'ai ce message d'erreur qui s'affiche : "Segmentation fault (core dumped)".
    A plusieurs essais, ça n'a pas marché.Je suis sur que c'est une erreur toute bête, mais je ne la trouve pas.

    Voici mon code :
    #include <stdio.h>
    #include <stdlib.h>

    ////>>>>>>>>>>>>>>>>>>>>>>>
    long longueurchaine(char *chaine);
    char copiedechaines(char *chaineacopier, char *chainecopiee);
    ////>>>>>>>>>>>>>>>>>>>>>>>
    int main(int argc, char *argv[])
    {
        char prenom[100];

        printf("Comment t'appelles-tu petit Zér0 ? ");
        scanf("%s", prenom);
        /*Message d'erreur entre ici<<<<<*/

        long retourchaine = longueurchaine(prenom);

        char chainecopiee[100];
        char chainecopiee2 = copiedechaines(prenom, chainecopiee);
        /*>>>>>Et la*/
        printf("Salut %s, je suis heureux de te rencontrer !\n\nTon nom fait %ld caractères de long!\nSa copie = %s", prenom, retourchaine, chainecopiee2);

            getchar();
            return 0;
    }

    ////calcule la longueur de la chaine
    long longueurchaine(char *chaine)
    {
        long i, longueurttal;

        for(i = 0 ; chaine[i] != '\0' ; i++)
        {
            longueurttal = i;
        }
        return longueurttal + 1;
    }

    ////copie une chaine sur une autre
    char copiedechaines(char prenom[], char chainecopiee[])
    {
        long i = 0;
        do
        {
            chainecopiee[i] = prenom[i];
            i++;
        }while(prenom[i] =! '\0');
        return chainecopiee[100];
    }

    Le message s'affiche juste après le scanf.

    Pour info, je suis sous linux depuis pas longtemps(et rien ne marche ).

    Ps: comment on exécute un programme créé avec code::blocks sous linux ( à part "build" :p )

    Edit: un des problèmes est résolu : Maintenant, il ne m'affiche plus que le message d'erreur, mais avant, il écrit ce qu'il y a dans le printf : "salut dagrut..." jusqu'a "long!", ce qui donne

    Comment t'appelles-tu petit Zér0 ? dagrut
    Salut dagrut, je suis heureux de te rencontrer !

    Ton nom fait 6 caractères de long!
    Segmentation fault (core dumped)

    Press ENTER to continue.

    Maintenant, c'est presque sur, l'erreur n'est pas dans la fonction.
    • Partager sur Facebook
    • Partager sur Twitter
      24 janvier 2007 à 14:44:08

      Salut Dargut,
      non ne te réjuit pas trop vite!
      Je cherche encore, mais, just comme ca,
      evite de nommer tes variable etc. come tu le fait: retourchaine
      mais ecris plutot retourChaine
      C'est plus claire.

      Ok, ok c'est pas mon probleme, c'est ton code
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        24 janvier 2007 à 14:47:22

        Pour l'exécuter en console, si ton programme s'appelle test et qu'il est placé dans ~/C_progs/ , tu lances un terminal, tu te places dans ~/C_progs ( cd ~/C_progs ) et tu le lances (./test ).

        Sinon j'ai pas touché au C depuis un petit moment mais déjà t'as une erreur dans ton scanf :
        scanf("%s", &prenom);

        ( n'oublies pas le & )
        Je sais pas si c'est la cause de l'erreur mais bon...
        • Partager sur Facebook
        • Partager sur Twitter
          24 janvier 2007 à 14:54:21

          Citation : Tuxicomane

          Pour l'exécuter en console, si ton programme s'appelle test et qu'il est placé dans ~/C_progs/ , tu lances un terminal, tu te places dans ~/C_progs ( cd ~/C_progs ) et tu le lances (./test ).

          Sinon j'ai pas touché au C depuis un petit moment mais déjà t'as une erreur dans ton scanf :

          scanf("%s", &prenom);


          ( n'oublies pas le & )
          Je sais pas si c'est la cause de l'erreur mais bon...


          non, ce n'est pas à cause de ça(va voir le cours de m@teo ;) et précisément, le QCM).
          Et merci pour la technique :ange: .
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            24 janvier 2007 à 14:57:32

            Oups.. :D
            Évidemment si j'essaie de donner des conseils sur un chapitre que je n'ai pas encore fait :-°
            • Partager sur Facebook
            • Partager sur Twitter
              24 janvier 2007 à 14:59:56

              Le problème à mon avis vient de la façon dont tu copies la chaîne.

              Pourquoi n'utilises-tu pas strcopy au lieu de faire ça dans un tableau non-alloué et tout et tout ?

              De plus tu passes un argument à la fonction un tableau de caractères alors que tu modifies sa valeur o_O . Si je me souviens de mes lointains cours de C, on passe par référence dans un coup comme ça. Je vais essayer de regarder où M@teo en parle dans son cours.

              EDIT : hop j'ai trouvé :

              Citation : Le cours du SdZ

              Le gros intérêt des pointeurs (mais ce n'est pas le seul), c'est de les envoyer à des fonctions pour qu'ils modifient directement une variable en mémoire, et non une copie comme on l'a vu.



              EDIT2 : Ahem, j'avais pas tout lu. Ok je comprends mieux. Ceci dit je verrai mieux ça comme la modification de la variable en entrée, mais bon tu n'as sûrement pas encore vu les pointeurs...
              • Partager sur Facebook
              • Partager sur Twitter
                24 janvier 2007 à 15:07:23

                Citation : Javier


                Pourquoi n'utilises-tu pas strcopy au lieu de faire ça dans un tableau non-alloué et tout et tout ?


                Car c'est ce que propose m@teo : c'est un exercice!

                Sinon, en trifouillant encore, j'ai trouvé l'erreur : "%s"!!! o_O
                Oui oui, c'est ça : j'ai essayé autre choses(%c, %ld...), et ça à marché.

                à %c, il à répondu D(Le D de Dagrut), et à %ld, il à donné la valeur numérique de D : 68.

                Edit: MIRACLE!!!! o_O c'est résolu.(j'ai toujours pas compris pourquoi).
                Voici mon code maintenant :
                #include <stdio.h>
                #include <stdlib.h>

                ////>>>>>>>>>>>>>>>>>>>>>>>
                long longueurchaine(char *chaine);
                void copiedechaines(char *chaineacopier, char *chainecopiee);
                ////>>>>>>>>>>>>>>>>>>>>>>>
                int main(int argc, char *argv[])
                {
                    char prenom[100];

                    printf("Comment t'appelles-tu petit Zér0 ? ");
                    scanf("%s", prenom);

                    long retourchaine = longueurchaine(prenom);

                    char chainecopiee[100];
                    copiedechaines(prenom, chainecopiee);

                    printf("Salut %s, je suis heureux de te rencontrer !\n\nTon nom fait %ld caractères de long!\nSa copie = %s", prenom, retourchaine, chainecopiee);

                        getchar();
                        return 0;
                }

                ////calcule la longueur de la chaine
                long longueurchaine(char *chaine)
                {
                    long i, longueurttal;

                    for(i = 0 ; chaine[i] != '\0' ; i++)
                    {
                        longueurttal = i;
                    }
                    return longueurttal + 1;
                }

                ////copie une chaine sur une autre
                void copiedechaines(char prenom[], char chainecopiee[])
                {
                    long i = 0;
                    do
                    {
                        chainecopiee[i] = prenom[i];
                        i++;
                    }while(prenom[i] != '\0');
                    <barre>return chainecopiee[100];</barre>//inutile
                }

                Merci à tous! :):)

                Ps: si j'ai vu les pointeurs : je suis là.
                • Partager sur Facebook
                • Partager sur Twitter
                  24 janvier 2007 à 15:21:32

                  Ce serait juste le "!=" à la place de "=!" ??? Je pensais que c'était une erreur en recopiant :\ .
                  • Partager sur Facebook
                  • Partager sur Twitter
                    24 janvier 2007 à 15:22:24

                    ton premier code tu a :

                    }while(prenom[i] =! '\0')

                    Trouve l'erreur ^^" (dans la fonction copiedechaines)

                    Sinon ta fonction n'a pas de sens ^^" ou tu fait une fonction void qui modifie ton string passe en parametre ou une fonction char qui prend 1 parametre
                    • Partager sur Facebook
                    • Partager sur Twitter
                      24 janvier 2007 à 15:23:08

                      Si je me trompe, il n'y a pas de changement!
                      Tu peut precier svp

                      EDITE 1:

                      Oups sa a continuer sans moi,
                      excuser moi svp
                      • Partager sur Facebook
                      • Partager sur Twitter
                        24 janvier 2007 à 15:32:04

                        Une erreur de ponctuation.J'aurais du m'en douter! (j'en fait toujours en français :p:honte: )

                        Citation : belfo


                        Sinon ta fonction n'a pas de sens ^^" ou tu fait une fonction void qui modifie ton string passe en parametre ou une fonction char qui prend 1 parametre


                        C'est vrai ça, tiens!Je vais modifier.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          24 janvier 2007 à 16:01:52

                          Trouvé !

                          La faute (dans ton premier code), était que ta fonction de copie renvoyait un char, et non un char* ! Tu essayais d'afficher une chaine qui n'était donc pas valide... Pour le prototype, essaie de garder celui d'origine de strcpy(), donc

                          char* nomFonction(char *destination, char *source);


                          aussi, tu faisais "return chainecopiee[100]", donc ça retournait le 101ème octet de ta chaine, et tu n'en avais alloué que 100, d'où la source de l'erreur de segmentation ;)
                          • Partager sur Facebook
                          • Partager sur Twitter

                          [C] Segmentation fault (core dumped)

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown