Erreur de segmentation : à cause d'un strcmp()
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é :lol: ...
Merci d'avance pour l'aide que vous pourrez m'apporter ;)
Code:
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
|
/*
crypte rep_depart extension nbMaxFils (Nb maximum de fils qui crypteront chacun des fichiers trouvés)
tube :
-> le père ouvre les chemin du fichier a traiter
-> les fils signalent qu'ils ont terminé
Tous les fichiers possédant cette extension effectue un cryptage rot13
-> par un processus fils
-> communication par tube
*/
#include <iostream>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <dirent.h>
#include <string.h>
#define MAXNAME 100
using namespace std;
/*
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){
cout << "Usage: crypte rep_depart ext nbProc" << endl;
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]);
ext = argv[2];
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){
cout << nom << endl;
/*
// On écrit le chemin dans le tube
close(p[0]);
write(p[1],&nom,strlength(nom)*sizeof(char));
close(p[1]);
*/
}
}
}
}
}
// On ferme le repertoire
closedir(rep);
} |