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
?
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
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.