IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

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


Sujet :

C

  1. #1
    Membre régulier Avatar de titou624
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 152
    Points : 87
    Points
    87
    Par défaut 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é ...
    Merci d'avance pour l'aide que vous pourrez m'apporter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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);
     
    }

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Salut,

    Ce code ressemble furieusement à du C pur, y compris dans les fichiers d'en-tête inclus.

    Avant de le déplacer dans la rubrique C, je voudrais confirmation du fait que ton objectif est de programmer en C, et non en C++...

    Pourrais tu me donner cette confirmation
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    heu ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include <iostream>
    using namespace std;
    cout << "Usage: crypte rep_depart ext nbProc" << endl;
    c'est pas du C mais bien du C++
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    heu ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include <iostream>
    using namespace std;
    cout << "Usage: crypte rep_depart ext nbProc" << endl;
    c'est pas du C mais bien du C++
    Ah, j'ai zappé ce qui est sans doute la seule ligne qui soit effectivement en C++ (il est vrai que j'ai parcouru le code en diagonale )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre régulier Avatar de titou624
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 152
    Points : 87
    Points
    87
    Par défaut
    Oui effectivement au départ la prof voulais qu'on réalise le code en C mais par soucis de simplicité je préfère les cout <<
    Une idée pour l'erreur ?

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Il manque la définition de ta structure struct dirent et ta fonction readdir.
    Comme c'est du C plutôt que tu C++, je déplace le sujet vers le forum C où les réponses seront plus appropriées.

    D'avance, merci aux intervenant du forum C de ne pas s'outrer de ce mélange incongru et de ne se concentrer que sur la partie problématique en C.

  7. #7
    Membre régulier Avatar de titou624
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 152
    Points : 87
    Points
    87
    Par défaut
    Pour ne choquer personne j'ai "traduit le code en C. cela sera peut-être plus clair pour tout le monde ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    /* 
    /*
    crypte rep_depart extension nbMaxFils (Nb maximum de fils qui cypteront 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 <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]);
    	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){
    								printf("%s \n",nom);
    /*
       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);
     
    }

  8. #8
    Membre régulier Avatar de titou624
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 152
    Points : 87
    Points
    87
    Par défaut
    Est-ce que quelqu'un sait comment un strcmp() peut causer une erreur de segmentation ?
    merci à tous parce que ça fait un long moment que je suis bloqué

  9. #9
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par titou624 Voir le message
    Est-ce que quelqu'un sait comment un strcmp() peut causer une erreur de segmentation ?
    strcmp() compare 2 chaines de caractères dont les pointeurs sont passés en paramètres à la fonction.

    Je suppose qu'il suffit qu'un des deux pointeurs soit malade pour que cela parte en live. Quelques idées :
    • Pointeur NULL
    • Pointeur fou (pointe n'importe où dans la mémoire)
    • chaine de caractère pas terminée par 0
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  10. #10
    Membre régulier Avatar de titou624
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 152
    Points : 87
    Points
    87
    Par défaut
    Tout d'abord merci pour ton aide !
    J'ai ajouté ce code pour tester les différentes erreurs possible mais rien n'y fait ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if(tmp != NULL && tmp[strlen(tmp)]=='\0'){
    	if(strcmp(tmp,ext)==0)
    		printf("%s \n",nom);
    toujours cette même erreur mais le plus navrant c'est que le code s'exécute correctement et l'erreur vient à la fin....

  11. #11
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    attention, si ton pointeur est fou ou que la chaine n'est pas terminée par 0, l'appel à strlen() va lui aussi partir en live.

    Je ne connais pas de manière simple de tester si un pointeur est fou ou si la chaine est bien terminée.

    Soit tu es rigoureux dans ta manière d'écrire et tu supprimeras 95% de ces problèmes (les 5 % restant, c'est que tu n'es pas assez rigoureux ) ou alors tu peux utiliser des programmes (purify mais c'est est payant, je ne sais pas si Valgrind sous Linux sait faire la même chose) qui permettent de valider tes paramètres.

    Après, il te reste le meilleur ami du développeur, c'est à dire le debugger
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  12. #12
    Membre régulier Avatar de titou624
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 152
    Points : 87
    Points
    87
    Par défaut
    merci beaucoup je ne connaissais pas cet outil je vais donc tester valgrind
    Bonne soirée à toi

  13. #13
    Membre chevronné
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Points : 1 944
    Points
    1 944
    Par défaut
    d'abort moi j'aime pas les wildes pointers. si tu pouvais prendre la bonne habitude d'orienter tes pointers a la declaration vers NULL ce serait mieux que des des pointeurs qui pointent vers ou bon leur semble.
    ensuite quand tu travailles avec des chaines de caracteres prefere utiliser string.h ou alors fais des copies octets par octets car c'est possible que tonsoit un probleme je te conseille donc de tester avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
         strcpy(ext,argv);
         ou
         for(i=0;i<strlen(argv[2]);i++)
            *(ext+i) = argv[2][1];
    la premiere etant pratique fait ca pour toutes tes chaines et apres dis nous si tu as toujours l'erreur?
    Petit lien vers mon premier jeux SDL2/C
    http://store.steampowered.com/app/72..._Soul_Of_Mask/
    la suite? ca vient,ca vient!

  14. #14
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par titou624 Voir le message
    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".
    Ce code (j'ai fait quelques remarques)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    /*
    crypte rep_depart extension nbMaxFils (Nb maximum de fils qui cypteront 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 <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];
     
    int main (int argc, char **argv)
    {
       int ret;
    /* Test des arguments */
       if (argc != 4)
       {
          printf ("Usage: crypte rep_depart ext nbProc\n");
          ret = EXIT_FAILURE;
       }
       else
    /* Déclaration des variables */
       {
    /* parametres dela ligne de commande */
          char *nomRep = argv[1];
          char *ext = argv[2];
    /* On converti le nombre de processus
         int nbProc = atoi (argv[3]);
    */
     
    /* ouverture du dossier */
          DIR *rep = opendir (nomRep);
     
    /* Test si le dossier s'ouvre correctement */
          if (!rep)
          {
    /* On signale l'erreur */
             perror ("opendir");
             ret = EXIT_FAILURE;
          }
          else
          {
             struct dirent *ent;
    /* Tant qu'il ya des fichiers */
             while ((ent = readdir (rep)) != NULL)
             {
     
                char nom[MAXNAME];
    /* On construit l'adresse du fichier */
    /* -ed- risque de debordement ... */
                strcpy (nom, nomRep);
     
    /* Si le fichier est différent de ./ ou ../ */
                if (strcmp (ent->d_name, ".") != 0
                    && strcmp (ent->d_name, "..") != 0)
                {
                   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
     
    -ed- (inconnu sur ma machine)
     
    */
                   {
                      struct stat buf;
                      if (stat (nom, &buf) != -1)
                      {
    /* Si c'est un fichier */
                         if (S_ISREG (buf.st_mode))
                         {
                            char *tmp = strrchr (ent->d_name, '.');
                            tmp++;
                            if (strcmp (tmp, ext) == 0)
                            {
                               printf ("%s \n", nom);
                            }
                         }
                      }
                   }
                }
             }
    /* On ferme le repertoire */
             closedir (rep);
             ret = EXIT_SUCCESS;
          }
       }
       return ret;
    }
    avec les paramètres
    fonctionne sans problèmes sous Windows :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ./data.txt
    ./dico.txt
    ./fable.txt
    ./fichier.txt
    ./groupes.txt
    ./in.txt
    ./niveaux.txt
     
    Process returned 0 (0x0)   execution time : 0.018 s
    Press any key to continue.
    J'ai trouvé le bug. Si il y a des fichiers sans extension, c'est le drame avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                            char *tmp = strrchr (ent->d_name, '.');
                            tmp++;
                            if (strcmp (tmp, ext) == 0)
                            {
                               printf ("%s \n", nom);
                            }
    il faut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
                            char *tmp = strrchr (ent->d_name, '.');
                            if (tmp != NULL)
                            {
                               if (strcmp (tmp + 1, ext) == 0)
                               {
                                  printf ("%s \n", nom);
                               }
                            }
    Pas de Wi-Fi à la maison : CPL

  15. #15
    Membre régulier Avatar de titou624
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 152
    Points : 87
    Points
    87
    Par défaut
    Merci pour ces information précieuses j'ai testé ces deux méthodes mais toujours cette même erreur ....
    Par soucis de simplicité j'ai allégé le code. Ce code cherche uniquement les fichiers avec l'extension donnée en paramètre mais je pense qu'il y a pas mal d'erreurs car il ne fonctionne pas et me marque toujours cette erreur de segmentation qui je l'avoue commence a e mettre les nefs dans un sale état....
    Lorsque l'on fait un strcpy faut-il faireun malloc avant ou pas pour la variable de destination ?

    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #include <sys/stat.h>
    #include <sys/types.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <dirent.h>
    #include <string.h>
     
    #define MAXNAME 100
     
    int main(int argc, char **argv){
     
    	if(argc!=3){
    		printf("Usage: find rep_depart ext \n");
    		exit(2);
    	}
     
    // initialisation des variables
    	struct stat buf;
    	struct dirent *ent;
    	char nom[MAXNAME];
    	char *ext = NULL;
    	char *nomRep = NULL;
    	DIR *rep = NULL;
     
    // On stock l'extension en variable
    	strcpy(ext,argv[2]);
     
    // On stock le nom du repertoire
      strcpy(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++;
    								printf("%s = %s ???\n",tmp,ext); 
    								if(!strcmp(tmp,ext)){
    									printf("OUI %s \n",nom);
     
    								}
    						}	
    				}
    			}
    	}
    // On ferme le repertoire
    	closedir(rep);
    }

  16. #16
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par titou624 Voir le message
    Merci pour ces information précieuses j'ai testé ces deux méthodes mais toujours cette même erreur ....
    J'ai indiqué où était le bug...
    Pas de Wi-Fi à la maison : CPL

  17. #17
    Membre régulier Avatar de titou624
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 152
    Points : 87
    Points
    87
    Par défaut
    Merci pour ta réponse Emmanuel !
    J'ai testé ton code je pense que c'est le problème car je suis sur linux ^^ désormais je crois que c'est une erreur de syntaxe.
    Voici le nouveau code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #include <sys/stat.h>
    #include <sys/types.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <dirent.h>
    #include <string.h>
     
    #define MAXNAME 100
     
    int main(int argc, char **argv){
     
    	if(argc!=3){
    		printf("Usage: find rep_depart ext \n");
    		exit(2);
    	}
     
    // initialisation des variables
    	struct stat buf;
    	struct dirent *ent;
    	char nom[MAXNAME];
    	char *ext = NULL;
    	char *nomRep = NULL;
    	DIR *rep = NULL;
     
    // On stock l'extension en variable
    	strcpy(ext,argv[2]);
     
    // On stock le nom du repertoire
      strcpy(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, '.');
                    if (tmp != NULL){
                       if (strcmp (tmp + 1, ext) == 0){
                          printf ("%s \n", nom);
                       }
                    }
    	     }	
             }
         }
      }//fin du while
     
    // On ferme le repertoire
    	closedir(rep);
    }
    j'essaye de débugger comme je puex ....
    En tout cas merci à vous pour l'interet que vous me portez ^^

  18. #18
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par titou624 Voir le message
    Merci pour ta réponse Emmanuel !
    J'ai testé ton code je pense que c'est le problème car je suis sur linux ^^
    dans mon code, j'ai remplacé lstat() par stat() ...

    Ton code (avec stat) provoque un crash chez moi (Windows). J'avais pourtant publié un code sécurisé... Je ne vais pas tout refaire, tu as tous les éléments.

    Purée, c'est quoi ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
          char *ext = NULL;
    <...>
     
    /* On stock l'extension en variable */
          strcpy (ext, argv[2]);
    Tu stockes où ? Et pourquoi tu fais une copie ? Il suffit de stocker l'adresse comme tu le faisais avant. Idem avec l'autre paramètre.

    Ces 2 corrections faites, le programme fonctionne correctement.
    Pas de Wi-Fi à la maison : CPL

  19. #19
    Membre régulier Avatar de titou624
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 152
    Points : 87
    Points
    87
    Par défaut
    Oui merci tu as déjà fais beaucoup je vais me débrouiller tout seul ^^.
    Merci à tous !

  20. #20
    Membre régulier Avatar de titou624
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 152
    Points : 87
    Points
    87
    Par défaut
    Bravo à tous mon code marche parfaitement. J'en ai eu tellement marre que j'ai tout recommencé en suivant les précieux conseils de tout le monde. Et ça a marché du premier coup !
    J'ai vraiment apprécié l'aide de tous les membres et dès que j'aurai un peu plus d'expérience je compte bien en faire partie !
    Bonne journée à tous !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Erreur de segmentation
    Par Trunks dans le forum C
    Réponses: 3
    Dernier message: 06/10/2005, 18h28
  2. Erreur de segmentation (Inconnue)
    Par Dark-Meteor dans le forum C
    Réponses: 5
    Dernier message: 08/09/2005, 13h42
  3. [MFC] erreur bizar a cause d'un activeX
    Par pitch21 dans le forum MFC
    Réponses: 12
    Dernier message: 29/06/2005, 14h36
  4. [Dev-C++] Erreur de segmentation...
    Par sas dans le forum Dev-C++
    Réponses: 11
    Dernier message: 26/03/2005, 14h25
  5. erreur de segmentation
    Par transistor49 dans le forum C++
    Réponses: 10
    Dernier message: 15/03/2005, 11h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo