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 :

Analyser la ligne de commande


Sujet :

C

  1. #1
    Candidat au Club
    Inscrit en
    Novembre 2002
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Analyser la ligne de commande
    je dois réaliser un programme qui analyse la ligne de commande. Je trouve normal d'utiliser les fonctions argv et argc. Le pb il faut que je teste argv[i] pour en déduire si c une option ou un argument ... je comprends pas comment faire ...

    A l'aide ...

    OptionParser.c

    Exemple de ligne : OptionParser -fc -abc -k foo -z
    doit afficher

    option f
    option c
    option a
    option b
    option c
    option k
    argument foo
    argument -z (si apres 1er argument alors = argument)


    J'arrive pas à saisir comme je peux tester argv[i] sachant que par exemple argv[1] sera égal à -fc, arg[2]=-abc ...
    à l'aide
    ZX TDeur ! Esinsien !!

  2. #2
    Membre éprouvé
    Avatar de jérôme
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    591
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 591
    Points : 1 071
    Points
    1 071
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    option = vrai
    pour 1<=i<argc
      si argv[i][0] == '-' et option == vrai// option
         afficher_options(argv[i])
      sinon // argument
         option = faux
         écrire argument
     
    afficher_options (options)
       pour 0<c<longueur(options)
          écrire options[c]
    Voilà, tu n'as plus qu'à le coder

  3. #3
    Membre averti

    Inscrit en
    Juin 2002
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 97
    Points : 307
    Points
    307
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(argv[i][0]=='-') //ou *(argv[i])==
       /*C'est une option*/ ;
    "J'ai toujours rêvé d'un ordinateur qui soit aussi facile à utiliser qu'un téléphone. Mon rêve s'est réalisé : je ne sais plus comment utiliser mon téléphone."-Bjarne Stroustrup
    www.stroustrup.com

  4. #4
    Membre éprouvé
    Avatar de jérôme
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    591
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 591
    Points : 1 071
    Points
    1 071
    Par défaut
    C'est pas suffisant
    argument -z (si apres 1er argument alors = argument)

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2002
    Messages : 19
    Points : 25
    Points
    25
    Par défaut
    Salut

    Sous linux il y a getopt qui fait ce travail.
    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
     
    while((Option = getopt(argc,argv,"abcfk:z:"))!=-1)
    {
      switch(Option)
      {
        case 'a':
        case 'b':
        case 'c':
        case 'f':
          prinf("option %c\n",Option);
          break;
        case 'k':
        case 'z':
          printf("option %c\nargument %s\n",Option,optarg);
          break;
      }
    }
    optarg : variable global de getopt qui contient l'argument d'un option

    pour plus de renseignement man 3 getopt
    Hot Metal

  6. #6
    Membre expérimenté
    Avatar de nyal
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    622
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 622
    Points : 1 428
    Points
    1 428
    Par défaut
    moi je trouve que getopt est une fonction qui n est pas terrible (idem en perl)
    il vaut mieux imlpementer un parseur pour la liste des options à la main pour des choses bien plus interessantes sur la ligne de commande

  7. #7
    Candidat au Club
    Inscrit en
    Novembre 2002
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    merci tout le monde, croyez moi j'ai du boulot ...
    ZX TDeur ! Esinsien !!

  8. #8
    Candidat au Club
    Inscrit en
    Novembre 2002
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    J'ai des soucis je suis parti du premier algorithme ... je comprends pas pour afficher_option comme je détermine la longueur(option) et que signifie écrire options.

    Deuxième question : que faire dans écrire argument ?

    Je suis un peu perdu et surtout débordé de boulot, merci à tous
    ZX TDeur ! Esinsien !!

  9. #9
    Membre averti

    Inscrit en
    Juin 2002
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 97
    Points : 307
    Points
    307
    Par défaut
    Complétons:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for(int i=1 ; i!=argc ; --i) //parcourir les arguments
    	if(argv[i][0]=='-') //si le premier caractère de l'argument est '-', c'est une option
    		for(char* popt= &argv[i][1] ; *popt!='\0' ; --popt) //parcourir les caractères de l'option
    			switch (*popt){
    				case 'a': /*option a*/; break
    				case 'b': /*option b*/; break
    				default : /*option inconnue*/;
    		}
    	else //pas une option
    		argv[i]; //traiter cet argument
    Attention, j'ai pas crash-testé !
    "J'ai toujours rêvé d'un ordinateur qui soit aussi facile à utiliser qu'un téléphone. Mon rêve s'est réalisé : je ne sais plus comment utiliser mon téléphone."-Bjarne Stroustrup
    www.stroustrup.com

  10. #10
    Candidat au Club
    Inscrit en
    Novembre 2002
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    mais çà marche pas, tout simplement car vous testez les lettres abc f ... et si je rentre optionparser -g -frt -av boc.c -k

    option g
    option f
    option r
    option t
    argument boc.c
    argument k

    vous comprenez la subtilité ?
    ZX TDeur ! Esinsien !!

  11. #11
    Membre éprouvé
    Avatar de jérôme
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    591
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 591
    Points : 1 071
    Points
    1 071
    Par défaut
    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
    #include <stdio.h>
     
    /*
    option = vrai 
    pour 1<=i<argc 
      si argv[i][0] == '-' et option == vrai// option 
         afficher_options(argv[i]) 
      sinon // argument 
         option = faux 
         écrire argument 
     
    afficher_options (options) 
       pour 0<c<longueur(options) 
          écrire options[c]
    */
     
    void afficher_options(char* options)
    {int len, c;
    len = strlen(options) ;
    for (c=1; c<len; c++)
        printf("option : %c\n", options[c]);
    }
     
    int main(int argc, char *argv[])
    {
    int option = 1, arg ;
    for (arg = 1; arg<argc; arg++)
        {if (argv[arg][0] == '-' && option)
            afficher_options(argv[arg]) ;
        else
            {option = 0;
            printf("argument : %s\n", argv[arg]) ;
            }
        }
    return 0;
    }

  12. #12
    Candidat au Club
    Inscrit en
    Novembre 2002
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    merci c parfait ... en plus g tout compris !
    ZX TDeur ! Esinsien !!

  13. #13
    Membre averti

    Inscrit en
    Juin 2002
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 97
    Points : 307
    Points
    307
    Par défaut
    En quoi mon exemple ne gère pas cettte "subtilité" ?

    Ce qu'il ne gère pas, ce sont les options de plusieurs caractères du genre "-all", mais ça n'est pas compliqué à rajouter.
    "J'ai toujours rêvé d'un ordinateur qui soit aussi facile à utiliser qu'un téléphone. Mon rêve s'est réalisé : je ne sais plus comment utiliser mon téléphone."-Bjarne Stroustrup
    www.stroustrup.com

  14. #14
    Candidat au Club
    Inscrit en
    Novembre 2002
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    pour la simple et bonne raison que si le premier argument détecté sans '-' ton programme marche OK ! mais si la suite est -k après le premier argument ce dernier sera détecté comme une option alors que c un argument.
    Merci quand même, j'apprécie toujours l'aide @+
    ZX TDeur ! Esinsien !!

  15. #15
    Membre averti

    Inscrit en
    Juin 2002
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 97
    Points : 307
    Points
    307
    Par défaut
    Quel idiot !
    Je faisait -- au lieu de ++ pour i et popt, j'avais oublié l'{ du for et le ; des break.
    Il faut toujours tester son 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
    int main( int argc, char *argv[ ])
    {
    	for(int i=1 ; i!=argc ; ++i) //parcourir les arguments 
    	{
    		if(argv[i][0]=='-') //si le premier caractère de l'argument est '-'...
    		{//...c'est une option.
    			for(char* popt= &argv[i][1] ; *popt!='\0' ; ++popt) //parcourir les caractères de l'option 
    			{
    				switch (*popt)
    				{ 
                case 'a': /*option a*/; break ;
                case 'b': /*option b*/; break ;
                default : /*option inconnue*/;
    				}
    			}
    		}
    		else
    		{//...c'est un argument 
    			argv[i]; //traiter cet argument 
    		}
    	}
     
    	return 0;
    }
    Et voilà.

    Je remercie au passage Visual C++ de m'avoir induit en erreur grâce à un bogue de l'indentation automatique.
    Ça m'apprendra à tasser le code, tiens !
    "J'ai toujours rêvé d'un ordinateur qui soit aussi facile à utiliser qu'un téléphone. Mon rêve s'est réalisé : je ne sais plus comment utiliser mon téléphone."-Bjarne Stroustrup
    www.stroustrup.com

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

Discussions similaires

  1. Réponses: 30
    Dernier message: 09/11/2012, 16h32
  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éponses: 2
    Dernier message: 13/06/2008, 11h56
  4. Analyser la ligne de commande
    Par smarties dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 29/03/2008, 11h33
  5. Récuperer Arguments sur la ligne de commande ?
    Par Muetdhiver dans le forum x86 16-bits
    Réponses: 9
    Dernier message: 20/01/2003, 21h01

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