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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé 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
    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
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    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 : 62
    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
    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
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    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 confirmé 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
    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
    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
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    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);
                               }
                            }

+ Répondre à la discussion
Cette discussion est résolue.

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