Erreur de segmentation : à cause d'un strcmp()

tibs624 Messages postés 2 Date d'inscription jeudi 2 octobre 2003 Statut Membre Dernière intervention 22 décembre 2008 - 22 déc. 2008 à 18:09
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 - 23 déc. 2008 à 14:34
Tout est dit dans le titre à la compilation aucun problème mais lors de l'exécution de mon programme.

Je vous met le code et les explications. Ce code à pour but de chercher
les fichiers comportant l'extension passée en paramètre puis de
modifier le contenu en le cryptant en rot13. Le code n'est pas encore
finni, pour l'instant je veux juste qu'il m'affiche les fichiers
trouvés. Il m'affiche bien les fichiers mais ensuite il m'affiche
"erreur de segmentation".

C'est un sujet de TP donc ce code n'a pas vraiment d'utilité ...

Merci d'avance pour l'aide que vous pourrez m'apporter
En mettant le strcmp() en commentaire je n'est plus l'erreur donc c'est ce test qui pose le problème ...

#include <sys/stat.h>
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#include <dirent.h>
#include <string.h>
#define MAXNAME 100

/*
    on créé le tube en premier
*/
int p[2];

// Fonction de cryptage //

char rot13(char n){
    if(n<'z' && n>'z'){
        n += 'a';
        n = (n+13)%26;
    }
    else if(n<'Z' && n>'A'){
        n += 'A';
        n = (n+13)%26;
    }
    return n;       
}

int main(int argc, char **argv){
// Test des arguments
    if(argc!=4){
        printf("Usage: crypte rep_depart ext nbProc \n");
        exit(2);
    }
//ouverture du tube
    pipe(p);

// Déclaration des variables
    int nbProc;
    struct stat buf;
    struct dirent *ent;
    char nom[MAXNAME];
    char *ext;
    char *nomRep;
    DIR *rep;

// On transtype le nombre de processus
    nbProc = atoi(argv[3]);
// On stock l'extension en variable
    ext = argv[2];
// On stock le nom du repertoire
    nomRep = argv[1];
   
//ouverture du dossier
    rep = opendir(nomRep);

//Test si le dossier s'ouvre correctement
    if(!rep){   
// On signale l'erreur
        perror("opendir");
    }

// Tant qu'il ya des fichiers
    while(ent=readdir(rep))
    {

// On construit l'adresse du fichier
            strcpy(nom,nomRep);
           
// Si le fichier est différent de ./ ou ../
            if(strcmp(ent->d_name,".") && strcmp(ent->d_name,"..")){
                strcat(nom,"/");
                strcat(nom,ent->d_name);

// On récupère les informations sur le fichier

// lstat permet d'éviter de compter les liens symbolique
                if(lstat(nom,&buf)!=-1){

// Si c'est un fichier
                        if(S_ISREG(buf.st_mode)){                           
                                char *tmp = strrchr(ent->d_name,(int)'.');
                                tmp++;
                            if(strcmp(tmp,ext)==0){
                                printf("%s \n",nom);
/*
 // On écrit le chemin dans le tube
                                close(p[0]);
                                write(p[1],&nom,strlength(nom));
                                close(p[1]);
*/
                            }       
                        }
                }   

            }
    }
// On ferme le repertoire
    closedir(rep);

}
A voir également:

2 réponses

tibs624 Messages postés 2 Date d'inscription jeudi 2 octobre 2003 Statut Membre Dernière intervention 22 décembre 2008
22 déc. 2008 à 23:38
pas d'idée ?
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
23 déc. 2008 à 14:34
Salut,

Tout le monde n'a pas un nunux sous la main. Par exemple, moi, j'en ai pas un, mais plusiseurs. Heu, bon, bref...

Tu devrais compiler avec -Wall et prendre en compte les warnings. Cela permet de corriger des problèmes, de clarifier le code en levant des ambiguitées...

En général, on ne mélange pas les déclarations et le code, encore que par défaut, certains compilateurs l'accèptent.

En plus de -Wall, on peut utiliser -ansi et -pedantic pour lever encore plus d'erreurs et faire du code théoriquement plus portable. Parce que sinon le compilo compile vraiment n'importe quoi : il invente des inclusions de headers, link on ne sait comment... L'orgie quoi. Sachant quand même que le côté chiant de la chose est que les commentaires // bien pratiques ne sont plus acceptés... On peut utilier -std=c99 à la place de ansi si on y tient.

C'est comme cela que l'on se rend compte par exemple que lstate n'est pas une fonction ISO par exemple... Je sais pas s'il existe un équivalent ISO (Soit dit en passant, c'est un peu moche de chercher à faire une erreur pour vérifier quelque chose), mais on peut utiliser #undef __STRICT_ANSI__ pour accèder aux fonctions non ISO tout en compilant quand même à peu près en ISO...

Les commentaires pas indentés me cassent les yeux, mais bon, c'est une question d'habitudes...

Bon, on va pouvoir s'attaquer au problème !

Bin tout bêtement, tu utilises strrchr pour chercher '.', mais tu ne teste pas si il y en a un dans la chaîne.

Je t'invite à t'orienter du côté de la compilation avec -g et à l'utilisation de ddd pour traiter tes futurs seg fault. Ou essayer Code::Blocks sous nunux. Ou passer sous Windows.
<hr size="2" width="100%" />#undef __STRICT_ANSI__

#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <dirent.h>
#include <string.h>
#define MAXNAME 100

int main(int argc, char **argv){
 
    /* Déclaration des variables */
    int nbProc;
    struct stat buf;
    struct dirent *ent;
    char nom[MAXNAME];
    char *ext;
    char *nomRep;
    DIR *rep;
    char* tmp;

    /* Test des arguments */
    if(argc!=4){
        printf("Usage: crypte rep_depart ext nbProc \n");
        exit(2);
    }

    /* On transtype le nombre de processus */
    nbProc = atoi(argv[3]);
    /* On stock l'extension en variable */
    ext = argv[2];
    /* On stock le nom du repertoire */
    nomRep = argv[1];
  
    /* Ouverture du dossier */
    rep = opendir(nomRep);

    /* Test si le dossier s'ouvre correctement */
    if(!rep){  
        /* On signale l'erreur */
        perror("opendir");
    }

    /* Tant qu'il ya des fichiers */
    ent=readdir(rep);
    while(ent)
    {
        /* On construit l'adresse du fichier */
        strcpy(nom,nomRep);
          
        /* Si le fichier est différent de ./ ou ../ */
        if(strcmp(ent->d_name,".") && strcmp(ent->d_name,"..")){
            strcat(nom,"/");
            strcat(nom,ent->d_name);

            /* lstat permet d'éviter de compter les liens symbolique */
            if(lstat(nom, &buf)!=-1){

                /* Si c'est un fichier */
                if(S_ISREG(buf.st_mode)){                          
                    tmp = strrchr(ent->d_name,(int)'.');
                    if (tmp){
                        tmp++;
                        if(strcmp(tmp,ext)==0)
                            printf("%s \n",nom);
                    }
                }
            }
        }
        ent = readdir(rep);
    }

    /* On ferme le repertoire */
    closedir(rep);
    return 0;
}
0
Rejoignez-nous