Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur de segmantation

kezako ?

Sujet résolu
    7 juin 2006 à 15:20:19

    Bonjour :)

    J'avais fait il y a quelques temps un programme mais ne le retrouvant pas je l'ai recodé. Cependant lors de l'execution (aucun pb à la compilation), j'ai un 'Erreur de segmantation' de la part de ma gentille console linux >_< !

    Bon je poste le code : le programme est censé renommer tous les fichiers d'un dossier en 'prefsep1.ext', 'prefsep2.ext', etc. avec pref un prefixe choisi, sep un sperateur choisi et ext l'extansion du fichier que l'on ne change pas (je n'ai codé pour l'instant que le du menu principal).
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <dirent.h>

    int main(int argc, char *argv[])
    {
        printf("\tBonjour et bienvenue dans mon Reorganiseur !\n"
               "\t--------------------------------------------\n\n\n");
        printf("Cet utilitaire permet d'organiser des fichiers dans un dossier :\n"
               "\t- pref 1.ext\n"
               "\t- pref 2.ext\n"
               "\t- etc.(ou 'pre'f est un prefixe choisis et 'ext' l'extension du fichier)\n\n");
        printf("Vous pouvez aussi rennommer l'extension d'un ensemble de fichiers d'un dossier :\n"
               "\t- bidule.extch\n"
               "\t- machin.extch\n"
               "\t- etc. (avec extch une extension choisis)\n\n");
        printf("Accéder au menu en appuyant sur une touche ...\n\n\n");
        getchar();

        long choix = 0;

        do
            {
                printf("[Menu principal]\n"
                       "\t1. Ordonner des fichier en choisissant un prefixe\n"
                       "\t2. Changer l'extaension d'un ensemble de fichiers\n"
                       "{Votre choix} : ");
                scanf("%ld", &choix);
            } while(choix != 1 && choix != 2);
        while(getchar() != '\n');

        /*Déclaration des variables*/
        DIR* rep;
        struct dirent *file;
        char adresse[1000]={0}, *s = NULL, os=0;

        printf("{Entrer l'adresse du dossier (ex : /home/moi/)} : ");
        fgets(adresse, sizeof(adresse), stdin);

        /*on retire le '\n'*/
        s = strchr(adresse, '\n');
        if(s != NULL)
            *s = 0;

        printf("{Vous êtes sous Windows/Linux ? (w = Window, i = Linux)} : ");
        os = getchar();
        while(getchar() != '\n');

        if(adresse[strlen(adresse)] != '\\' || adresse[strlen(adresse)] != '/')
            {
                if(os='w')
                    adresse[(strlen(adresse)+1)] = '\\';
                if(os='i')
                    adresse[(strlen(adresse)+1)] = '/';
            }

        rep = opendir(adresse);
        readdir(rep); //On passe le '..'
        readdir(rep); //On passe le '.'

        /*On gère le premier cas*/
        if(choix = 1)
            {
                /*Déclaration de variables*/
                char prefixe[100] = {0}, *ext = NULL, sep[10]={0};
                long i = 0;
                

                printf("[Menu 1]\nVous vous apprêter à ordonner vos fichiers !\n\n");
                printf("{Choisissez un prefixe (ex : vacances)} : ");
                fgets(prefixe, sizeof(prefixe), stdin);
                if(s != NULL)
                    *s = 0;
                printf("{Choisissez un separateur (ex : _ pour pref_1, etc.)} : ");
                fgets(sep, sizeof(sep), stdin);
                if(s != NULL)
                    *s = 0;

                printf("Debut des operations demandees ...\n");

                /*On retient l'extension*/
                ext = strrchr(file->d_name, '.');

                char ancien[1000]={0}, nouv[1000]={0};
                while(file = readdir(rep))
                    {
                        i++;
                        sprintf(ancien, "%s%s", adresse, file->d_name);
                        sprintf(nouv, "%s%s%s%ld%s", adresse, prefixe, sep, i, ext);
                        rename(ancien, nouv);
                    }
                printf("Fin des operations demandees : operations effectuees.");
            }
        return EXIT_SUCCESS;
    }


    Voilà l'erreur arrive après 'Début des operations demandees' je suppose donc que l'erreur se situe au niveau de la boucle mais quelle est-elle (surtout qu'il n'y a aucune détection à la compilation) ?

    Merci d'avance ;)
    • Partager sur Facebook
    • Partager sur Twitter
      7 juin 2006 à 21:38:41

      Une segmentation fault, c'est un problème avec un pointeur qui est déréférencé ou inversement. Je suis pas sûr, mais vérifie la syntaxe de ton strchr, ça peut venir de là...
      • Partager sur Facebook
      • Partager sur Twitter
        7 juin 2006 à 22:15:59

        Non c'est bon en fait c'est que j'essayais de faire un sprintf avec ext = NULL (abh oui sous linux t'a pas forcément d'extensions ^^ ).
        Merci tout de même
        • Partager sur Facebook
        • Partager sur Twitter

        Erreur de segmantation

        × 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