J'ai un programme qui accepte plusieurs arguments de ligne de commande, donc j'utilise getopt. Un de mes arguments prend une chaîne comme paramètre. Est-il possible d'obtenir cette chaîne via la fonction getopt ou devrais-je l'obtenir via le tableau argv []? Peut également getopt lire des arguments comme -file
? Tous les arguments que j'ai vus jusqu'à présent n'ont qu'un seul caractère tel que -a
MODIFIER
À partir des réponses ci-dessous, j'ai écrit un programme pour utiliser getopt_long (), mais l'instruction switch ne reconnaît l'argument que lorsque j'utilise l'argument caractère et non l'argument long. Je ne sais pas pourquoi cela se produit. En passant les arguments -mf -file sample
Je ne vois pas les instructions d'impression.
MODIFIER
J'ai essayé d'entrer les arguments de commande en tant que --file
et puis ça a marché. N'est-il pas possible de le faire avec simplement -file
?
static struct option long_options[] =
{
{"mf", required_argument, NULL, 'a'},
{"md", required_argument, NULL, 'b'},
{"mn", required_argument, NULL, 'c'},
{"mw", required_argument, NULL, 'd'},
{"lf", required_argument, NULL, 'e'},
{"ld", required_argument, NULL, 'f'},
{"ln", required_argument, NULL, 'g'},
{"lw", required_argument, NULL, 'h'},
{"rf", required_argument, NULL, 'i'},
{"rd", required_argument, NULL, 'j'},
{"rn", required_argument, NULL, 'k'},
{"rw", required_argument, NULL, 'l'},
{"df", required_argument, NULL, 'm'},
{"dd", required_argument, NULL, 'n'},
{"dn", required_argument, NULL, 'o'},
{"dw", required_argument, NULL, 'p'},
{"file", required_argument, NULL, 'q'},
{NULL, 0, NULL, 0}
};
int ch=0;
while ((ch = getopt_long(argc, argv, "abcdefghijklmnopq:", long_options, NULL)) != -1)
{
// check to see if a single character or long option came through
switch (ch){
case 'a':
cout<<"title";
break;
case 'b':
break;
case 'c':
break;
case 'd':
break;
case 'e':
break;
case 'f':
break;
case 'g':
break;
case 'h':
break;
case 'i':
break;
case 'j':
break;
case 'k':
break;
case 'l':
break;
case 'm':
break;
case 'n':
break;
case 'o':
break;
case 'p':
break;
case 'q':
cout<<"file";
break;
case '?':
cout<<"wrong message"
break;
}
}
Lis man getopt
http://linux.die.net/man/3/getopt
optstring est une chaîne contenant les caractères d'option légitimes. Si un tel caractère est suivi de deux points, l'option nécessite un argument, donc getopt () place un pointeur vers le texte suivant dans le même élément argv, ou le texte de l'élément argv suivant, dans optarg. Deux deux-points signifient qu'une option prend un argument optionnel; s'il y a du texte dans l'élément argv actuel (c'est-à-dire dans le même mot que le nom de l'option lui-même, par exemple, "-oarg"), alors il est renvoyé dans optarg, sinon optarg est mis à zéro.
Un exemple de code:
#include <stdio.h>
#include <unistd.h>
int main (int argc, char *argv[])
{
int opt;
while ((opt = getopt (argc, argv, "i:o:")) != -1)
{
switch (opt)
{
case 'i':
printf ("Input file: \"%s\"\n", optarg);
break;
case 'o':
printf ("Output file: \"%s\"\n", optarg);
break;
}
}
return 0;
}
Ici dans le optstring
est "i: o:" le caractère deux-points ':' après chaque caractère de la chaîne indique que ces options nécessiteront un argument. Vous pouvez trouver un argument sous forme de chaîne dans la variable globale optarg
. Voir le manuel pour plus de détails et plus d'exemples.
Pour plus d'un commutateur d'options de caractère, voir les options longues getopt_long
. Consultez le manuel pour des exemples.
[~ # ~] modifiez [~ # ~] en réponse aux options longues '-':
Depuis les pages de manuel
getopt_long_only () est comme getopt_long (), mais '-' ainsi que "-" peuvent indiquer une option longue. Si une option commençant par "-" (et non "-") ne correspond pas à une option longue, mais correspond à une option courte, elle est analysée comme une option courte à la place.
Consultez le manuel et essayez-le.
Pour spécifier qu'un indicateur nécessite un argument, ajoutez un ":" juste après l'indicateur dans la variable short_opt. Pour utiliser des arguments longs, utilisez getopt_long ().
Voici un exemple de programme rapide:
#include <getopt.h>
#include <stdio.h>
int main(int argc, char * argv[]);
int main(int argc, char * argv[])
{
int c;
const char * short_opt = "hf:";
struct option long_opt[] =
{
{"help", no_argument, NULL, 'h'},
{"file", required_argument, NULL, 'f'},
{NULL, 0, NULL, 0 }
};
while((c = getopt_long(argc, argv, short_opt, long_opt, NULL)) != -1)
{
switch(c)
{
case -1: /* no more arguments */
case 0: /* long options toggles */
break;
case 'f':
printf("you entered \"%s\"\n", optarg);
break;
case 'h':
printf("Usage: %s [OPTIONS]\n", argv[0]);
printf(" -f file file\n");
printf(" -h, --help print this help and exit\n");
printf("\n");
return(0);
case ':':
case '?':
fprintf(stderr, "Try `%s --help' for more information.\n", argv[0]);
return(-2);
default:
fprintf(stderr, "%s: invalid option -- %c\n", argv[0], c);
fprintf(stderr, "Try `%s --help' for more information.\n", argv[0]);
return(-2);
};
};
return(0);
}