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 :

Utiliser getopt correctement


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 44
    Par défaut Utiliser getopt correctement
    Bonjour à tous, j'ai un petit programme à faire en c, et je voudrais améliorer la reconnaissance des diffèrentes options. En effet, jusqu'à maintenant, je fait quelques boucles avec les arguments pour obtenir ce que je veux, mais je pense qu'utiliser "getopt" voir même "getopt_long" rendrait le code plus propre et plus précis.


    En gros, j'ai trois options possibles :

    -i, action : mettre une variable "flagI" à 1;
    -g, action : mettre une variable "flagG" à 1;
    -n, qui prend en paramètre un nombre et qui va le ranger dans une variable de type int;

    Et après toutes ces options je passe des fichiers, il faut que je puisse récupérer leur nom.

    Le plus compliqué c'est pour l'option "-n", dans certains cas ça bug avec mon code.
    Je voudrais aussi pouvoir appeler l'option "-n" avec le nombre juste derrière ou avec un espace entre les deux.
    Il faudrait également que je puisse mettre les options séparemment (-g -i ...) ou ensemble (-gi..).



    Quelques exemples d'utilisation :

    int flagI;
    int flagG;
    int nombre=3;

    ./mon_programme -i -g -n23

    Action : flagI=1 , flagG=1, nombre=23.

    Dans certains cas, j'hésite sur quel action déclencher, par exemple :

    ./mon_programme -ign23

    Pour i et g ça ne pose pas de problème, mais ça fait un peu crade d'accepter n ça parce que i, n ok, mais n derrière avec un paramètre...


    J'ai trouvé quelques truc sur get_opt mais c'était souvent trop compliqué, et pas expliqué...

    Merci d'avance pour votre aide

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 052
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 052
    Billets dans le blog
    141
    Par défaut
    Bonjour

    Citation Envoyé par jujusous3 Voir le message
    ./mon_programme -i -g -n23

    Action : flagI=1 , flagG=1, nombre=23.

    Dans certains cas, j'hésite sur quel action déclencher, par exemple :

    ./mon_programme -ign23

    Pour i et g ça ne pose pas de problème, mais ça fait un peu crade d'accepter n ça parce que i, n ok, mais n derrière avec un paramètre...


    J'ai trouvé quelques truc sur get_opt mais c'était souvent trop compliqué, et pas expliqué...

    Merci d'avance pour votre aide
    Sous linux, habituellement, un argument d'une option est détaché d'un espace.
    Donc si vous mettez:
    ./programme -n 23
    ça marche.
    Ils n'ont pas à être détaché.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 44
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Bonjour



    Sous linux, habituellement, un argument d'une option est détaché d'un espace.
    Donc si vous mettez:
    ./programme -n 23
    ça marche.
    Ils n'ont pas à être détaché.
    Je comprend très bien, j'ai d'ailleurs permis "avec" et "sans" espace dans mon code, mais le problème c'est pour certains cas où ça coince (comme le cas que j'ai mis dans mon 1er post), dans tous les cas, mon code devient un peu crade, et j'aurais voulu utiliser get_opt... J'aurais juste voulu que quelqu'un puisse me donner un exemple d'utilisation avec trois options, dont une qui prend un paramètre. J'ai trouvé des codes là dessus mais je ne comprend pas tout...


    Merci encore

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 052
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 052
    Billets dans le blog
    141
    Par défaut
    Dans le man 3 getopt , il ya deux exemples très bien fait.
    Après faut lire la page de man, et cela se comprend assez facilement je crois.

    Veuillez nous précisé ce que vous ne comprennez pas
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 44
    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
    while ((ch = getopt(argc, argv, "bf:")) != -1) {
                 switch (ch) {
                 case 'b':
                         bflag = 1;
                         break;
                 case 'f':
                         if ((fd = open(optarg, O_RDONLY, 0)) < 0) {
                                 (void)fprintf(stderr,
                                     "myname: %s: %s\n", optarg, strerror(errno));
                                 exit(1);
                         }
                         break;
                 case '?':
                 default:
                         usage();
                 }
         }
         argc -= optind;
         argv += optind;


    Que veut dire le "bf:" ? Oui sont définies les réglages style on accepte un paramètre derrière cet option là et pas pour celle là...


    Merci

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 052
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 052
    Billets dans le blog
    141
    Par défaut
    Ne vous ai je pas dis de lire le manuel ?

    Donc le lien est ici: http://man.developpez.com/man3/getopt.3.php

    Maintenant, le "bf:" du getopt, indique que les options acceptées sont '-b' et '-f' et que l'option f prend un paramètre. ( Qui sera dans la variable optarg )
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

Discussions similaires

  1. utiliser sscanf correctement
    Par KateA dans le forum Débuter
    Réponses: 11
    Dernier message: 02/02/2010, 14h09
  2. (Bash) Impossible d'utiliser Getopts ?
    Par muse19 dans le forum Linux
    Réponses: 9
    Dernier message: 11/09/2007, 17h07
  3. [Tableaux] utiliser modulo correctement
    Par jexl dans le forum Langage
    Réponses: 1
    Dernier message: 13/06/2007, 00h14
  4. Réponses: 20
    Dernier message: 28/01/2006, 11h27
  5. Comment utiliser correctement le debugger de DevCPP
    Par Le Furet dans le forum Dev-C++
    Réponses: 2
    Dernier message: 29/09/2005, 09h56

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