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 :

Analyse des options de la ligne de commande


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Etudiant En dev jeux video ESGI. Dev c/c++
    Inscrit en
    Novembre 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Vietnam

    Informations professionnelles :
    Activité : Etudiant En dev jeux video ESGI. Dev c/c++

    Informations forums :
    Inscription : Novembre 2012
    Messages : 63
    Par défaut Analyse des options de la ligne de commande
    Dans le but d'un projet sur le codage d'un grep. Je me suis demande, vue qu'on peut combiner plusieurs option, comment faire?[la syntaxe du grep est donc varible ....].
    J'ai etendue quelque par ... "parseur" si cela parle à quelqu'un ...
    pour-ai je avoir des informations dessus? surtout dans le concept de parseur de commande ou d'argument ...

  2. #2
    Membre émérite
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Par défaut
    Parser est un bien grand mot en l'occurrence. La stratégie habituelle consiste à jouer avec les booléens ou les flags, et quelques énumérations. Concrètement, il te suffit de faire une boucle sur chaque argument (donc argv[i], ou i varie entre 1 et argc - 1). Si tu reconnais cet argument, tu ajoutes au booléen (ou au flag) correspondant la valeur vraie. À la fin de ta boucle, tu sais donc quelles ont été les options réquisitionnées par l'utilisateur. Dans la pratique, il existe des utilitaires divers et variés comme getopt (POSIX.1-2001) qui permettent de te faciliter le travail, en allant chercher les options directement. Ça dépend dans quelle optique tu réalises ce programme. Un petit exemple pour une commande acceptant les options -e, -i, et -o.

    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
    #include <getopt.h>
    #include <stdlib.h>
     
    enum {
    	OPTION_E = 1,
    	OPTION_I = OPTION_E << 1,
    	OPTION_O = OPTION_I << 1
    };
     
    int main(int argc, char *argv[])
    {
    	unsigned int flag = 0U;
     
    	for (;;) {
    		int c = getopt(argc, argv, "eio");
     
    		if (c == -1)
    			break;
    		else switch (c) {
    		case 'e': flag |= OPTION_E; break;
    		case 'i': flag |= OPTION_I; break;
    		case 'o': flag |= OPTION_O; break;
    		default: /* option inconnue */
    		}
    	}
     
    	if (flag & OPTION_E) /* option -e */
    	if (flag & OPTION_I) /* option -i */
    	if (flag & OPTION_O) /* option -o */
     
    	return EXIT_SUCCESS;
    }
    Dis-nous plus précisément où tu coinces. Étudie la documentation.
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  3. #3
    Membre confirmé
    Homme Profil pro
    Etudiant En dev jeux video ESGI. Dev c/c++
    Inscrit en
    Novembre 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Vietnam

    Informations professionnelles :
    Activité : Etudiant En dev jeux video ESGI. Dev c/c++

    Informations forums :
    Inscription : Novembre 2012
    Messages : 63
    Par défaut
    Merci de ta reponce.

    tu me demande dans quel optique?
    Je suis dans un group et on doit coder le grep avec un maximum d'option(en c).
    Moi je doit m'occuper de coder la fonction de base et d'une fonction qui gere les differentes options.

    my_grep devras tourner sur mac et donc linux et bien sur microsoft.
    Et cela est donc problematique et dite moi si je me trompe mqis getop() et seulement sur linux. Comme la je code sur Visual Studio ...

  4. #4
    Membre émérite
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Par défaut
    Effectivement, comme Microsoft fait du portage POSIX à sa sauce, il sera difficile d'utiliser getopt de manière portable, ici. Tu devras donc traiter les arguments par toi-même (à moins qu'une recherche te mène à d'autres bibliothèques qui correspondraient plus à tes attentes). Tu peux donc faire comme je te l'ai dit dans mon précédent message. Je te propose un squelette (non testé, évidemment) :

    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
    unsigned int option = 0U;
     
    for (i = 1; i < argc; ++i) {
        switch (get_option(argv[i])) {
        case 'e':
            option |= OPTION_E;
            break;
        case 'i':
            option |= OPTION_I;
            break;
        case 'o':
            option |= OPTION_O;
            break;
        default:
            /* argument inconnu */
        }
    }
    Avec get_option qui extrait d'un argument l'option contenue. Si des options prennent des arguments en plus, tu peux te créer un pointeur sur l'argument, et l'avancer après l'option dans la fonction en question.
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  5. #5
    Membre confirmé
    Homme Profil pro
    Etudiant En dev jeux video ESGI. Dev c/c++
    Inscrit en
    Novembre 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Vietnam

    Informations professionnelles :
    Activité : Etudiant En dev jeux video ESGI. Dev c/c++

    Informations forums :
    Inscription : Novembre 2012
    Messages : 63
    Par défaut
    voila ce qure j'ai fait pour l'instant :
    #define OptMax 4

    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
     
    #define OptMax 4 // je me limite pour l'instant à 3 options
    typedef struct s_parametre
    {
    	int option[OptMax]; // save the different option extracted of argv
    	char **str_cmd;		// save argv whitout option
    }t_parametre;
     
    int main(int argc,char** argv)
    {
    	t_parametre parametre;
     
    	parseur_parametre(argc,argv,&parametre); 
     
    	return 0;
    }
     
    void parseur_parametre(int c_argc,char ** c_argv,t_parametre *c_parametre)
    {
    	int i= 0;
    	int it_str_cmd = 0;
    	c_parametre->str_cmd = (char**)malloc((c_argc)*sizeof(char*));
     
    	//init********************************************************
    	for(i;i<c_argc;i+=1)
    	{
    		c_parametre->str_cmd[i] = 0;
    	}
    	for(i = 0;i<OptMax;i+=1)
    	{
    		c_parametre->option[i]=0;
    	}
    	//***********************************************************
     
    	if(c_argc<2)
    	{
    		Error();//print Error on screen
    		exit(1);
    	}
    	for(i=0;i<c_argc;i+=1)
    	{
    		if(c_argv[i][0] == '-') // check if there are option(s) ('-' is only 
                                                                     on the first line of c_argv)
    		{
    			//get_opt() permet de determiner le nbre d'option et quel   
                                                                                    option appliquee
    			get_opt(&c_argv[i][1],c_parametre) //take the next 
                                                                                 caracteres after'-'
    		}
    		else
    		{
    			c_parametre->str_cmd[it_str_cmd] = c_argv[i];
    			it_str_cmd+=1;
    		}
    	}
    	if(it_str_cmd == 1)
    	{
    		Error();
    		printf("Aide: verifier la syntaxe apres [OPTION]\n");
    		exit(1);
    	}
     
     
    }
    puis apres j'ai essaye de me coder un get_opt() à ma maniere.

    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
     
     
    int get_opt(char *str_opt,t_parametre *c_parametre)
    {
    	char option[]={'E','F','G','P',0}; // liste d'option diponible du grep
    	int i = 0,j = 0;
     
    	for(i;str_opt[i];i+=1)
    	{
    		for(j;option[j];j+=1)
    		{
    			if(str_opt[i]==option[j])
    			{
     
    			}
    		}
    	}
     
    }
    le truc c'est que je fais sa au feeline ... je sais pas trop si ce que je fais est bon ...

  6. #6
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    pour getopt il y'a une fonction standard qui fait a peu pres ce que tu souhaite:

    http://www.kernel.org/doc/man-pages/.../getopt.3.html
    The following trivial example program uses getopt() to handle two program
    options: -n, with no associated value; and -t val, which expects an associated
    value.

    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
    #include <unistd.h>
    #include <stdlib.h>
    #include <stdio.h>
     
    int main(int argc, char *argv[])
    {
        int flags, opt;
        int nsecs, tfnd;
     
        nsecs = 0;
        tfnd = 0;
        flags = 0;
        while ((opt = getopt(argc, argv, "nt:")) != -1) {
            switch (opt) {
            case 'n':
                flags = 1;
                break;
            case 't':
                nsecs = atoi(optarg);
                tfnd = 1;
                break;
            default: /* '?' */
                fprintf(stderr, "Usage: %s [-t nsecs] [-n] name\n",
                        argv[0]);
                exit(EXIT_FAILURE);
            }
        }
     
        printf("flags=%d; tfnd=%d; optind=%d\n", flags, tfnd, optind);
     
        if (optind >= argc) {
            fprintf(stderr, "Expected argument after options\n");
            exit(EXIT_FAILURE);
        }
     
        printf("name argument = %s\n", argv[optind]);
     
        /* Other code omitted */
     
        exit(EXIT_SUCCESS);
    }

  7. #7
    Membre confirmé
    Homme Profil pro
    Etudiant En dev jeux video ESGI. Dev c/c++
    Inscrit en
    Novembre 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Vietnam

    Informations professionnelles :
    Activité : Etudiant En dev jeux video ESGI. Dev c/c++

    Informations forums :
    Inscription : Novembre 2012
    Messages : 63
    Par défaut
    merci de ta reponce jabounnet. Mais ton avatar de chapelier fous me perturbe un peu XD

    Alors la je comprend pas ...j'ai une erreur de compilateur qui me sort par les port ....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error C2082: redefinition of formal parameter "My_Error
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int My_Error();  --> dans le .h
    int My_Error()
    {
    	printf("Error: veuillez verifier que vous utiliser grep avec cette syntaxe :\ngrep [OPTION]... PATTERN [FILE]\n");
    	//exit(1);	
    	return 1;
    }
    et d'apres msdn http://msdn.microsoft.com/fr-fr/libr...=vs.80%29.aspx

    se serais un probleme de redefinition des parametres ... mais ma fonction n'a pas de parametre ....

  8. #8
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    se serais un probleme de redefinition des parametres ... mais ma fonction n'a pas de parametre ....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int My_Error(void);  --> dans le .h
    int My_Error(void)
    ?

  9. #9
    Membre confirmé
    Homme Profil pro
    Etudiant En dev jeux video ESGI. Dev c/c++
    Inscrit en
    Novembre 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Vietnam

    Informations professionnelles :
    Activité : Etudiant En dev jeux video ESGI. Dev c/c++

    Informations forums :
    Inscription : Novembre 2012
    Messages : 63
    Par défaut
    Heuuu oui d'accord void est le parametre par default ... mais sa regle pas du tout mon probleme ...

  10. #10
    Membre émérite
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Par défaut
    On pourrait peut-être avoir ton code complet, afin que nous puissions localiser et reproduire l'erreur ?
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

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

Discussions similaires

  1. Gestion des options de la ligne de commande
    Par gl dans le forum Télécharger
    Réponses: 0
    Dernier message: 30/11/2010, 17h38
  2. Analyser les options passées en ligne de commande
    Par Musaran dans le forum Télécharger
    Réponses: 0
    Dernier message: 30/11/2010, 17h33
  3. Récupérer des arguments passé en ligne de commande
    Par FinalSpirit dans le forum VBScript
    Réponses: 2
    Dernier message: 01/10/2007, 10h54
  4. Control des bureaux virtuels en ligne de commande ?
    Par Stéphane ERARD dans le forum Applications et environnements graphiques
    Réponses: 3
    Dernier message: 20/06/2006, 09h22
  5. Réponses: 6
    Dernier message: 05/10/2005, 14h22

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