Getopt arguments optionnels?
J'ai un programme dans lequel vous entrez une option
-d
et puis, si oui ou non vous fournir un non-argument facultatif après l'option, faire quelque chose.
Voilà mon code:
#include <stdio.h>
#include <getopt.h>
#include <stdlib.h>
#define OPT_LIST "d::"
int main (int argc, char *argv[])
{
int c;
char string[] = "blah";
while ((c = getopt (argc, argv, OPT_LIST)) != -1)
{
switch (c)
{
case 'd':
printf("%s\n", optarg);
break;
case '?':
fprintf(stderr, "invalid option\n");
exit(EXIT_FAILURE);
}
}
}
Donc, si vous entrez un non-argument facultatif après l'option, il imprime l'argument. Mais je veux imprimer le char "chaîne" si l'utilisateur ne fournit pas un non-argument optionnel (c'est pourquoi j'ai mis le double deux-points dans les
OPT_LIST). Mais je ne suis pas sûr de savoir comment ce faire de sorte que toute aide serait grandement appréciée.
Heres ce qui se passe quand je lance le programme:
user:desktop shaun$ ./arg -d hello
hello
user:desktop shaun$ ./arg -d
./arg: option requires an argument -- d
invalid option
Je suis sur un Mac avec OS X à l'aide du langage C.
Euh,
Je veux de la chaîne d'impression lorsque je lance le programme comme ceci: ./arg -d
C'est exactement ce que la ligne ci-dessus ferait si elle est insérée à l'endroit où
J'ai essayé et il a imprimé la chaîne, mais il a également imprimé
Vous ne pouvez pas.
printf("%s\n", string)
?Je veux de la chaîne d'impression lorsque je lance le programme comme ceci: ./arg -d
C'est exactement ce que la ligne ci-dessus ferait si elle est insérée à l'endroit où
fprintf(stderr, "invalid option\n");
réside actuellement.J'ai essayé et il a imprimé la chaîne, mais il a également imprimé
./arg: option requires an argument -- d
Aucune idée de comment se débarrasser de l'erreur?Vous ne pouvez pas.
getopt()
est nécessaire pour imprimer un message de diagnostic.OriginalL'auteur pudumaster | 2013-10-26
Vous devez vous connecter pour publier un commentaire.
L ' "option de la valeur d'une option" fonctionnalité est uniquement un GNU libc extension, n'est pas requis par la norme POSIX, et est probablement tout simplement mis en oeuvre par la libc livré avec Mac OS X.
https://www.gnu.org/software/libc/manual/html_node/Using-Getopt.html
En fait, POSIX.1-2008 date, la section 12.2, "Syntaxe de l'Utilitaire lignes Directrices", interdit explicitement de cette fonctionnalité:
http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html#tag_12_02
OriginalL'auteur Delan Azabani
Selon la getopt de la documentation, il sera de retour
:
si une option avec un argument qui ne l'est pas. Il définit égalementoptopt
avec la mise en correspondance argument.Par conséquent, l'utilisation:
optstring = ":d:f:"
, avec une première:
, pour permettre à des arguments optionnels. Quelque chose de très ennuyeux, c'est que, tandis quefoo -d
etfoo -f arg
fonctionner comme prévu,foo -d -f arg
erreurs-f
pour la optarg à-d
.... Toute soigné workwaround ?Je pense que vous devez vérifier manuellement si
optarg
ressemble à une option (par exemple,optarg[0]=='-'
), et si oui, alors rewind 'optind' à lire (optind-=1;
). Ceci est rendu plus délicat si vous voulez accepter un nombre négatif comme une option arg, ce qui peut suggérer pourquoi POSIX interdit totalement (la ligne directrice n ° 7). cf. stackoverflow.com/a/32575314/2975337OriginalL'auteur reece
Je suis peut-être pas compris la question. Je suis en train de lire, comme si l'utilisateur veut plus rouler getopt par défaut de la gestion des erreurs. Si c'est le cas, ne devrait-il pas être : dans le début de leur OPT_LIST? Je pense que le code ci-dessus est une bonne chose, cependant, je pense qu'il aura toujours l'impression
Pour réduire cela, n'avons-nous pas besoin d'un : au début de la OPT_LIST? Par exemple, la modification de cette:
:
Corrigez-moi si je me trompe.
OriginalL'auteur Spork Schivago
D'essayer cette solution. Il fonctionne pour moi. Envisager l'option " z " comme option avec argument optionnel.
Voici quelques exemples:
OriginalL'auteur tomas zubrik