begin process at 2012 05 29 08:30:14
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Débutant(e)

 > 

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


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

lundi 22 décembre 2008 à 18:09:25 | Erreur de segmentation : à cause d'un strcmp()

tibs624

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);

}

lundi 22 décembre 2008 à 23:38:45 | Re : Erreur de segmentation : à cause d'un strcmp()

tibs624

pas d'idée ?
mardi 23 décembre 2008 à 14:34:59 | Re : Erreur de segmentation : à cause d'un strcmp()

rt15

Membre Club Administrateur CodeS-SourceS
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.

#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;
}





Cette discussion est classée dans : include, rep, char, strcmp, if


Répondre à ce message

Sujets en rapport avec ce message

Petit problème avec NEW DELETE et RETURN [ par kuruma ] Bonjourj'ai un petit problème avec cette fonction. en c++ ou c :#include #include #include #include #include #include <cst pb pour l'affichage d'un tableau [ par blinix123 ] #include #include #include #include     struct cd{ char artiste [64]; char cryptage de cesar sur c++ [ par juniordiaw ] bjr a tous g un problemea vec mon code o faite lorske g rentre un letre il me la crypte mai sil sagi dun mo ou dune phrase il ne crypte ke la premiere date de création fichier + C [ par ar1du62 ] Bonjour! :) J'ai un pti'probleme trés simple mais qui me prend la tete royalement... Donc j'ai un repertoire contenant que des fichiers... et je ve besoin d'aide sur un programme en C éxécutable mais qui se bloque au début " recherche et affichage de palindromes " [ par nirvanitta ] salut tous le monde Mon programme consiste a ouvrir un fichier et chercher tous les palindromes et les afficher avec leurs numéros de lignes et leurs interpreteur sql [ par cobutanisme154 ] bonjours tout le monde, j'ai cherché sur ce site et sur google ,mais je n'arrive pas à trouver un interpréteur sql écrit en c.Quand je dis un interpré Suppression de caractères d'un gros fichier texte [ par mslider ] --Bonjour, c'est juste pour une petite aide. J'ai utilisé un code qui avait été mis au point à l'origine pour faire du cross-table(tableau croisé, vo Lister automatiquement les fichiers d'un repertoire : problème de portabilité? [ par hakimus ] Bonjour à tous, Je cherche à récupérer la liste de tous les fichiers présents dans un répertoire, en C++. De ce que j'ai lû jusqu'à présent, le code Un char[n] est différent d'un char* ??? [ par Polack77 ] Bonjour, J'ai une erreur TRÈS étrange que vraiment je ne comprend pas [^^confus2] Dans "l'application" : [code=cpp]#include #include #include vo nbr premier [ par rama340 ] [size=200][code=cpp]puvez vous me corrigée mon prg ; svp;il est ecri en c;(concernent les nbrs premiers); #include #include char nbr_premier(char t[],


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,655 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales