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 dans mon programme


Sujet :

C

  1. #1
    Nouveau candidat au Club
    Inscrit en
    Janvier 2013
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Janvier 2013
    Messages : 1
    Par défaut Erreur dans mon programme
    Bonjour a tous!!!,
    J'ai creer un programme qui a pour but de simuler la commande FIND avec des paramètre.
    mais lorsque je tente d'executer mon programme il me retourne une erreur de ";" attendu mais je n'arrive pas a corrige ce probleme je vous joint le code ci dessous:

    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
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <dirent.h>
    #include <sys/types.h>
    #include <time.h>
    #include <errno.h>
    #include <sys/stat.h>
     
    void help (void)
    {
        // le manuel
    }
    void tree (char *filename, int marque,int printout)
    {
                DIR* rep=NULL; //pointeur dir
                struct dirent *fichierLU; //instanciation provenant de la biblioteque dirent.h pointeur
                rep = opendir("."); //ouverture d'un dossier actuel, rÈcent
                char memrep[500]; //tempon du repertoire
                fichierLU = readdir(rep); //prend le repertoire rep
                struct stat dir_stat;
                getcwd(memrep, 500);
                struct _stat buf;
                int result;
                char *timebuf;
                int timer;
     
            while ((fichierLU=readdir(rep))!=NULL){ //boucle
                if(strcmp(fichierLU->d_name,"..")!=0 &&(fichierLU->d_name && strstr(fichierLU->d_name, filename)))
    {
                    if(printout==1)
                    {
                        printf("%s/%s\n", memrep,fichierLU->d_name);
     
                            if (marque==1)
                            {
                                result = stat (fichierLU->d_name, &buf);
                                timebuf = ctime(&buf.st_ctime);
                                printf ("Date de creation: %s", timebuf);
                            }
     
                            if (marque==2)
                            {
                                result = stat (fichierLU->d_name, &buf);
                                timebuf = ctime(&buf.st_mtime);
                                printf ("Date de modification: %s", timebuf);
                            }
     
                            if (marque==3)
                            {
                                result = stat (fichierLU->d_name, &buf);
                                timebuf = ctime(&buf.st_atime);
                                printf ("Derniere ouverture du fichier: %s", timebuf);
                            }
     
                        if(stat(fichierLU->d_name, &dir_stat)==-1)
                        perror("stat");
     
                        if(strcmp(".",fichierLU->d_name)  == 0 ||strcmp("..",fichierLU->d_name) == 0)
                            continue;
                    ;
                        if (S_ISDIR(dir_stat.st_mode)) {
                        //change into the new directory
                            if (chdir(fichierLU->d_name) == -1)
                            {
     
                            perror("");
                            continue;
                            }
     
                            tree(filename,marque,printout);
                            chdir("..");
                        }
     
            }
    }
    int main(int argc, char* argv [])
    {
        char* dir_path; //path to the directory
        char* filename; // pattern to match
        char *pw_name;
        struct stat dir_stat; //used by stat
        int i;
        int marqueur=0;
        int printout=0;
     
        if (argc<2)
        {
            printf("arguments insufisants");
            return 1;
        }
    for (i=1;argv[i];i++)
    {
        if ((((argv[i][0]=='C')&& (argv[i][1]==':')||(argv[i][0]=='C')&&(argv[i][1]==':')||(argv[i][0]=='/')))) // partie de gauche C: Windows / partie de droite / pour linux
    } ;
     
    //printf("%s",dir_path);
     
        for (i=1, argv[i], i++)
    {
        if(strcmp(argv[i],"-ctime")==0)
        {
            marqueur=1;
        }
     
        if (strcmp(argv[i],"-atime")==0)
        {
            marqueur=2;
        }
     
        if (strcmp(argv[i],"mtime")==0)
        {
            marqueur=3;
        }
    }
        for(i=0;argv[i];i++)
        {
            if ((strcmp(argv[i]),"-help"==0 ||(strcmp(argv[i]),"--help")==0)
        }
    for (i=1;argv[o;i++])
    {
     
     
        if(strcmp(argv[i],"-name")==0)  //argument -name making the find searching by name
        {
                printout=1;
                filename=argv[i+1];
            if (stat(dir_path, &dir_stat)== -1) {
    perror("stat");
    exit(1);
        }
            if (!S_ISDIR(dir_stat.st_mode)) {
    fprintf(stderr, "'%s' is not a directory\n", dir_path);
    exit(1);
        }
     
        // change into the given directory
        if (chdir(dir_path) == -1) {
    fprintf(stderr, "Cannot change to directory '%s': ", dir_path);
    perror("");
    exit(1);
     
        }
    }
        //else return 0;
    }
     
     
            tree(filename,marqueur,printout);
     
     
        // }
        return 0;
    }
    Merci d'avance pour votre aide

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    Bonjour,

    En parlant des ';' (et après un survol rapide)

    Il n'y en a pas à la fin de la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ((((argv[i][0]=='C')&& (argv[i][1]==':')||(argv[i][0]=='C')&&(argv[i][1]==':')||(argv[i][0]=='/'))))
    ou de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ((strcmp(argv[i]),"-help"==0 ||(strcmp(argv[i]),"--help")==0)
    Il devrait y en avoir à la place des ',' dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (i=1, argv[i], i++)
    Sinon il y a d'autres erreurs (fonction non fermée, parenthèses mal placées...) mais un compilateur un peu locace devrait bien t'aider dans un premier temps

  3. #3
    Membre à l'essai
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Décembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 6
    Par défaut
    Merci pour ta réponse.

    du coup j'ai recommencé depuis le début et la j'ai de nouveau une erreur...

    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
    #include <stdlib.h>/* pour exit()*/
    #include <stdio.h>/* pour puts() */
    #include <dirent.h>/* Pour l'utilisation des dossiers */
    #include <errno.h>
    #include <string.h>
    #ifndef WIN32
    #include <sys/types.h>
     
    #endif
     
    int main(int argc, char *argv[])
    {
        DIR* rep = NULL;
        struct dirent* fichierLu = NULL; /* Déclaration d'un pointeur vers la structure dirent. */
        rep = opendir("%d", argv);/* POURQUOI CA MARCHE PAS (erreur too many arguments to function 'opendir' !!!!!! */
        if (rep == NULL)
            perror(""); /*perror donne le détail de l'erreur suite a ouverture du repertoire */
     
        fichierLu = readdir(rep); /* On lit le premier répertoire du dossier. */
        while ((fichierLu = readdir(rep)) != NULL)
     
            if(strstr(fichierLu->d_name,"do")!=NULL)
                printf("%s\n", fichierLu->d_name);
     
     
        if (closedir(rep) == -1)
            exit(-1);
     
        return 0;
    }
    j'ai mis la variable opendir en tant que paramètre mais des que je compile mon prog j'ai le message d'erreur : erreur too many arguments to function 'opendir'

    vous avez une idée ?

    Merci par avance .

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 447
    Par défaut
    Bonsoir,

    Citation Envoyé par mars2690 Voir le message
    rep = opendir("%d", argv);/* POURQUOI CA MARCHE PAS (erreur too many arguments to function 'opendir' !!!!!! */
    Parce que cette syntaxe ("%d", argv) n'est valable qu'avec printf() et ses dérivés. Plus précisément, printf() signifie « Formatted Print » et sert à générer en sortie une chaîne de caractères en fonction des données et du format que tu spécifies. Cette chaîne est donc calculée et construite à l'exécution, et a besoin d'espace mémoire pour y être déposée.

    Pour faire ce que tu veux faire, il faut déclarer un buffer, utiliser sprintf() pour y construire une chaîne de caractères, puis passer l'adresse de ce buffer à opendir() pour qu'il ouvre le bon répertoire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        char buffer[256];
     
        snprintf (buffer,sizeof buffer,"%d",argc);
        opendir(buffer);

    Mais en réalité, il y a peu de chances que ce soit ce que tu cherches à faire parce que tu utilises argv. « argc » est un entier qui t'indique combien d'arguments sont passés sur ta ligne, et « argv » est un tableau de chaînes de caractères (plus précisément un tableau de pointeurs sur chacune d'elles).

    Sache cependant que le nom du programme lui-même compte comme un argument. Donc :

    — argv[0] pointe toujours le nom du programme ;
    — argv[1] pointe le premier paramètre ;
    — argv[2] pointe le second ;
    — etc.

    Si tu es sûr que « argc > 1 », alors tu peux directement passer « argv[1] » à opendir().

  5. #5
    Membre à l'essai
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Décembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 6
    Par défaut
    Merci pour votre réponse j'ai donc rajouté (je l’espère au bonne endroit, je débute vraiment dans la programmation...) et j'ai bien mis en argument argv[1] car je veut qu'il prenne en charge le première argument.

    voici ce que ça donne :

    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
    #include <stdlib.h>/* pour exit()*/
    #include <stdio.h>/* pour puts() */
    #include <dirent.h>/* Pour l'utilisation des dossiers */
    #include <errno.h>
    #include <string.h>
    #ifndef WIN32
    #include <sys/types.h>
     
    #endif
     
    int main(int argc, char *argv[])
    {
        char buffer[256];
     
        DIR* rep = NULL;
        struct dirent* fichierLu = NULL; /* Déclaration d'un pointeur vers la structure dirent. */
        rep = snprintf (buffer,sizeof buffer,"%d",argv[1]);
        opendir(buffer);
        if (rep == NULL)
            perror(""); /*perror donne le détail de l'erreur suite a ouverture du repertoire */
     
        fichierLu = readdir(rep); /* On lit le premier répertoire du dossier. */
        while ((fichierLu = readdir(rep)) != NULL)
     
            if(strstr(fichierLu->d_name,"do")!=NULL)
                printf("%s\n", fichierLu->d_name);
     
     
        if (closedir(rep) == -1)
            exit(-1);
     
        return 0;
    }
    Quand je le compile aucun problèmes mais quand je l’exécute il plante

    Je pense avoir fait une erreur dans la syntaxe mais ou je n'en ai aucune idées .

    Merci pour vos réponses !

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rep = snprintf (buffer,sizeof buffer,"%d",argv[1]);
    Ca c'est pas bon :

    - 'snprintf' ne risque pas de renvoyer une variable de type 'DIR*'
    - "%d" signifie que tu lit un entier ("%s" pour une chaine de caractères)

  7. #7
    Membre à l'essai
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Décembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 6
    Par défaut
    Effectivement j'avais fais quelques erreurs....

    Voici mon programme qui est maintenant "ok" :

    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
    #include <stdlib.h>/* pour exit()*/
    #include <stdio.h>/* pour puts() */
    #include <dirent.h>/* Pour l'utilisation des dossiers */
    #include <errno.h>
    #include <string.h>
    #ifndef WIN32
    #include <sys/types.h>
     
    #endif
     
    int main(int argc, char**argv[])
    {
        DIR* rep = NULL;
        struct dirent* fichierLu = NULL; /* Déclaration d'un pointeur vers la structure dirent. */
        rep = opendir(argv[1]);
        if (rep == NULL)
            perror(""); /*perror donne le détail de l'erreur suite a ouverture du repertoire */
     
        fichierLu = readdir(rep); /* On lit le premier répertoire du dossier. */
        while ((fichierLu = readdir(rep)) != NULL)
     
            if(strstr(fichierLu->d_name,argv[2])!=NULL)
                printf("%s\n", fichierLu->d_name);
     
     
        if (closedir(rep) == -1)
            exit(-1);
     
        return 0;
    }
    voici un exemple d'argument valide : C:\Windows tr (séparé par un espace pour prendre en compte deux arguments)



    Enfin, Une dernière question

    Il faudrait pour terminer mon prog de faire un man :

    je vous explique, j'aimerais que quand je rentre en argument "--help" (et rien d'autre) le programme ne m'affiche uniquement un texte (printf) et donc ne pas prendre en compte les autres paramètres... je ne sais pas si c'est assez clair pour vous

    Merci de vos réponses !

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 447
    Par défaut
    Citation Envoyé par mars2690 Voir le message
    Il faudrait pour terminer mon prog de faire un man :
    Les man pages sont littéralement les « pages du manuel » Unix : elles ont un format particulier. On y accède en principe via la commande « man commande » mais elles sont parfois hébergées en ligne, notamment ici : http://man.developpez.com/ mais ce n'est pas un terme générique.

    je vous explique, j'aimerais que quand je rentre en argument "--help" (et rien d'autre) le programme ne m'affiche uniquement un texte (printf) et donc ne pas prendre en compte les autres paramètres... je ne sais pas si c'est assez clair pour vous

    Merci de vos réponses !
    Quel est le problème ?

    Il suffit de débuter ton programme par une boucle for qui examine chaque argument et vérifie si l'un d'eux pointe une chaîne qui contient exactement « --help ».

  9. #9
    Membre à l'essai
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Décembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 6
    Par défaut
    j'ai essayé de faire un truc en rapport avec vos recommandations mais cela pose problème.

    Voici mon prog :

    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
    #include <stdlib.h>/* pour exit()*/
    #include <stdio.h>/* pour puts() */
    #include <dirent.h>/* Pour l'utilisation des dossiers */
    #include <errno.h>
    #include <string.h>
    #ifndef WIN32
    #include <sys/types.h>
     
    #endif
     
    int main(int argc, char**argv[])
    {
     
        if (argv[3] =="--help");
        {
        printf("ECRIRE LE MAN ICI");
        exit(-1);
        }
        else
     
     
        DIR* rep = NULL;
        struct dirent* fichierLu = NULL; /* Déclaration d'un pointeur vers la structure dirent. */
        rep = opendir(argv[1]);
        if (rep == NULL)
            perror(""); /*perror donne le détail de l'erreur suite a ouverture du repertoire */
     
        fichierLu = readdir(rep); /* On lit le premier répertoire du dossier. */
        while ((fichierLu = readdir(rep)) != NULL)
     
            if(strstr(fichierLu->d_name,argv[2])!=NULL)
                printf("%s\n", fichierLu->d_name);
     
     
        if (closedir(rep) == -1)
            exit(-1);
     
        return 0;
    }
    J'aimerais que quand je marque en argument " --help"(oui il y a bien deux espaces avant les --).

    il n'execute juste la partie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        if (argv[3] =="--help");
        {
        printf("ECRIRE LE MAN ICI");
        exit(-1);
    au lieu de ça il ne prend meme pas en compte le fait que j'ai mis dans les argument 2 espaces puis --help.
    Et le exit(-1) lui non plus n'est pas pris en compte...

    Avez-vous une idée ?

    Merci encore..

  10. #10
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 447
    Par défaut
    Tu ne peux pas comparer deux chaînes de caractères avec « == ». Il faut utiliser strcmp(). Je pensais que tu le savais déjà puisque tu l'utilises déjà aux lignes 29, 59, 101, 106, 111, 118 et 124 du programme de ton premier commentaire.

    Il faut également faire attention aux nombres d'arguments dont tu disposes vraiment. Il faut toujours que l'indice que tu passes à argv soit inférieur à la valeur de argc, sinon tu vas taper dans le vide et risquer de déclencher une segfault.

Discussions similaires

  1. Erreur dans mon programme que je n'arrive pas à corriger
    Par alex7443 dans le forum Débuter
    Réponses: 3
    Dernier message: 25/03/2009, 14h46
  2. Réponses: 1
    Dernier message: 18/04/2008, 04h33
  3. je ne trouve pas l'erreur dans mon programme
    Par Briska dans le forum Débuter
    Réponses: 19
    Dernier message: 04/04/2008, 09h21
  4. [Help] Erreurs dans mon programme
    Par Tacha dans le forum Langage
    Réponses: 13
    Dernier message: 02/10/2006, 13h57
  5. [Lien]erreur dans mon programme python
    Par durnambule dans le forum Général Python
    Réponses: 11
    Dernier message: 29/01/2004, 14h59

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