Question

Mon argument est comme ceci

./a.out -i file1 file2 file3

Comment puis-je utiliser getopt() pour obtenir 3 (ou plus) les fichiers d'entrée? Je fais quelque chose comme ceci:

while ((opt = getopt(argc, argv, "i:xyz.."))!= -1){
  case 'i':
     input = optarg; 
     break;
  ...
}

Je Parvenez file1; comment obtenir file2, file3?

Était-ce utile?

La solution

Si vous devez, vous pouvez commencer à argv[optind] et optind incrément vous. Cependant, je recommande contre ce que je considère que la syntaxe d'être mauvaise forme. (Comment savez-vous quand vous avez atteint la fin de la liste? Et si quelqu'un a un fichier nommé avec un - comme premier caractère?)

Je pense que ce serait encore mieux de changer votre syntaxe soit:

/a.out -i file1 -i file2 -i file3

Ou pour traiter la liste des fichiers en tant que paramètres de position:

/a.out file1 file2 file3

Autres conseils

Je sais que c'est assez vieux, mais je suis tombé dans ma recherche d'une solution.

while((command = getopt(argc, argv, "a:")) != -1){

    switch(command){
        case 'a':

        (...)

        optind--;
        for( ;optind < argc && *argv[optind] != '-'; optind++){
              DoSomething( argv[optind] );         
        }

        break;
    }

I a constaté que int optind (extern utilisée par getopt () ) pointe vers la position suivante après le 'courant argv ' sélectionné par < em> getopt () ; Voilà pourquoi je diminue au début.

D'abord boucle vérifie si la valeur de l'argument actuel est dans les limites de argv ( argc est la longueur du tableau si la dernière position dans argv de tableau est argc-1 ). Deuxième partie de && compare si le premier caractère de l'argument suivant est « - ». Si le premier caractère est « - » alors nous manquons des valeurs suivantes pour l'argument actuel autre argv [optind] est notre valeur suivante. Et ainsi de suite jusqu'à ce que la argv est terminée ou un argument à court de valeurs.

A l'incrément de fin optind pour vérifier la prochaine argv.

Notez que parce que nous vérifions « optind » première seconde partie de la condition ne sera pas exécuté à moins que la première partie est vrai donc pas de soucis de lecture en dehors des limites du tableau.

PS Je suis tout à fait nouveau programmeur C si quelqu'un a une amélioration ou critique s'il vous plaît le partager.

Notez que la permutation de l'argument nonconformant glibc extension briser toute tentative d'utiliser plusieurs arguments pour -i de cette manière. Et sur les systèmes non-GNU, le « second argument -i » sera interprété comme le premier argument non optionnel, arrêter toute nouvelle analyse des options. Avec ces questions à l'esprit, je laisserais tomber getopt et écrire votre propre analyseur de ligne de commande si vous souhaitez utiliser cette syntaxe, car il n'est pas une syntaxe prise en charge par getopt.

J'ai regardé et essayé le code ci-dessus, mais je l'ai trouvé ma solution un peu plus facile et a mieux fonctionné pour moi:

Le traitement que je voulais était:

-m mux_i2c_group mux_i2c_out

(2 arguments nécessaires).

Voici comment il batée pour moi:

case 'm':
    mux_i2c_group = strtol(optarg, &ch_p, 0);

    if (optind < argc && *argv[optind] != '-'){
        mux_i2c_out = strtol(argv[optind], NULL, 0);
        optind++;
    } else {
        fprintf(stderr, "\n-m option require TWO arguments <mux_group> "
                        "<mux_out>\n\n");
        usage();
    }

    use_mux_flag = 1;
    break;

a saisi la première forme de valeur normale moi et puis juste regardé pour la seconde valeur requise.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top