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 :

Problème d'ordre avec getopt


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 10
    Points : 9
    Points
    9
    Par défaut Problème d'ordre avec getopt
    Bonjour à tous,

    Je dois traiter les arguments de mon programme. Pour cela, j'utilisa la fonction getopt.
    Voici comment comment lancer mon programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tftp ip port [-b blksize] [-w windowsize] src_file dest_file
    Donc avant les options, j'ai des arguments comme une adresse IP et un port. Apès mes options, j'ai deux noms de fichier.
    Le problème c'est que mes options doivent être en premier et ensuite mes arguments (qui ne sont pas des options) pour que cela marche. Si j'intercale des options avec des arguments, getopt ignores les options. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tftp -b 1024 -w 5 localhost 25565 fichier1 fichier2
    marche correctement, mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tftp localhost 25565 -b 1024 -w 5 fichier1 fichier2
    ne fonctionne pas, getopt ne retourne rien.

    Voici mon 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
    int main(int argc, char **argv) {
        int ch;
     
        while ((ch = getopt(argc, argv, "b:w:")) != -1) {
            switch (ch) {
                case 'b':
                    printf("blksize: %s\n", optarg);
                    break;
                case 'w':
                    printf("blksize: %s\n", optarg);
                    break;
                default:
                    usage(argv[0]);
                    exit(EXIT_FAILURE);
            }
        }
     
        for (; optind < argc; ++optind) {
    	printf ("argv[%d] : %s\n", optind, argv[optind]);
        }
     
        return EXIT_SUCCESS;
    }
    Pouvez-vous m'aider ?

    Merci

    EDIT

    Bon alors j'ai réussi à obtenir ce que je voulais, mais je trouve la solution très sale. L'idée c'est de récupérer l'IP et le port, puis récupérer les options et enfin, récupérer le fichier source et le fichier de destination. Voici le 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
    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
    // Récupère l'adresse IP et le port
        char *ip, *port;
        ip = argv[1];
        if (ip == NULL) {
            usage(argv[0]);
            exit(EXIT_FAILURE);
        }
        port = argv[2];
        if (port == NULL) {
            usage(argv[0]);
            exit(EXIT_FAILURE);
        }
     
        // Récupère les options
        int ch;
        char *blksize, *windowsize;
        optind += 2;
        while ((ch = getopt(argc, argv, "b:w:")) != -1) {
            switch (ch) {
                case 'b':
                    blksize = optarg;
                    break;
                case 'w':
                    windowsize = optarg;
                    break;
                default:
                    usage(argv[0]);
                    exit(EXIT_FAILURE);
            }
        }
     
        // Récupère le nom du fichier source et de destination
        char *file_src, *file_dest;
        file_src = argv[optind];
        if (file_src == NULL) {
            usage(argv[0]);
            exit(EXIT_FAILURE);
        }
        file_dest = argv[optind + 1];
        if (file_dest == NULL) {
            usage(argv[0]);
            exit(EXIT_FAILURE);
        }
     
        // Affiche les arguments
        printf("ip: %s\n", ip);
        printf("port: %s\n", port);
        if (blksize != NULL) {
            printf("blksize: %s\n", blksize);
        }
        if (windowsize != NULL) {
            printf("windowsize: %s\n", windowsize);
        }
        printf("file src: %s\n", file_src);
        printf("file_dest: %s\n", file_dest);

  2. #2
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    D'après la page de manuel :
    By default, getopt() permutes the contents of argv as it scans, so that eventually all the nonoptions are at the end. Two other modes are also implemented. If the first character of optstring is '+' or the environment variable POSIXLY_CORRECT is set, then option processing stops as soon as a nonoption argument is encountered. If the first character of optstring is '-', then each nonoption argv-element is handled as if it were the argument of an option with character code 1.
    Tu n'aurais pas POSIXLY_CORRECT de défini ?


    Mis à part cela tu ne testes pas '?' qui est renvoyé par getopt dans certains cas.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    Non. Je travaille sous Mac, voici les arguments que je donne à GCC :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CFLAGS = -std=c11 -Wall -Werror -Wextra -pedantic -D_XOPEN_SOURCE=600
    Si getopt me renvoie '?', il doit rentrer dans le default, en théorie.

    EDIT

    Apparement, on peut utiliser le caractère '+' au début de optstring pour régler le problème. Mais ça n'est pas supporter sur Mac d'après GNU.org :https://www.gnu.org/software/gnulib/...de/getopt.html

  4. #4
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    C'est l'inverse, '+' force aussi la compatibilité POSIX. Que renvoie env | grep '^POSIXLY_CORRECT=' ?

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par Matt_Houston Voir le message
    C'est l'inverse, '+' force aussi la compatibilité POSIX. Que renvoie env | grep '^POSIXLY_CORRECT=' ?
    Rien du tout, la variable n'est pas définie.

    Sinon, j'ai fait ma petite investigation. Étant donné que Mac OS X est un système BSD, les extensions GNU ne sont pas disponibles. Sur BSD, getopt s'arrête dès qu'il rencontre une option inconnue. Je dois donc manuellement récupérer l'IP et le port, récupérer les options et enfin, les deux dernier arguments.

  6. #6
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Si j'étais à ta place je remplacerais plutôt l'implémentation de getopt. Il doit y avoir un package getopt-gnu disponible, c'est mentionné dans ton lien.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    C'est portable ça ?

    Après mon projet c'est pour mes cours et j'ai pas le droit d'utiliser des bibliothèque tierces...

  8. #8
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Je ne sais pas, Mac c'est vraiment pas ma tasse de thé. Le package doit se trouver dans les dépôts officiels je pense. Ensuite faut voir avec ton prof si c'est autorisé, j'imagine.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    Je vais rester sur getopt pour l'instant en bidouillant manuellement et j'expliquerai que l'implémentation sur Mac est différente.
    Mais pour la prochaine fois, je changerai l'implementation

    Merci beaucoup, sujet résolu.

  10. #10
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    Les souces de getopt-gnu sont disponibles via gnulib. Malgré le nom ce n'est pas une bibliothèque tierce mais plus un dépôt de sources → Gnulib Module List

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

Discussions similaires

  1. [JAXB] Problème d'ordre des éléments avec JAXB
    Par blessed1213 dans le forum Format d'échange (XML, JSON...)
    Réponses: 0
    Dernier message: 07/04/2014, 12h43
  2. Réponses: 5
    Dernier message: 22/08/2013, 16h30
  3. [ksh] Problème d'utilisation avec getopts
    Par 1Breton dans le forum Applications et environnements graphiques
    Réponses: 0
    Dernier message: 13/08/2007, 12h13
  4. Problème de date avec Getopt
    Par SkyDev dans le forum Langage
    Réponses: 2
    Dernier message: 27/02/2007, 18h08
  5. Problèmes de versions avec Xalan, Xerces et Java
    Par honeyz dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 05/06/2003, 10h18

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