Getopt – Passage du paramètre de chaîne pour l’argument

J’ai un programme qui prend plusieurs arguments en ligne de commande, donc j’utilise getopt. L’un de mes arguments prend une chaîne en tant que paramètre. Est-il possible d’obtenir cette chaîne via la fonction getopt ou devrais-je l’obtenir via le tableau argv []? De plus, getopt read lit des -file comme -file ? Tous les arguments que j’ai vus jusqu’à présent n’ont qu’un seul caractère tel que -a

MODIFIER

Parmi les réponses ci-dessous, j’ai écrit un programme utilisant getopt_long (), mais l’instruction switch ne reconnaît l’argument que lorsque j’utilise l’argument de 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 print.

MODIFIER

J’ai essayé d’entrer les arguments de la commande en tant que --file , puis cela a fonctionné. N’est-il pas possible de faire cela avec juste -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; } } 

Lire l’ man getopt http://linux.die.net/man/3/getopt

optssortingng 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. Ainsi, getopt () place un pointeur sur le texte suivant dans le même élément argv ou sur le texte de l’élément argv suivant dans optarg. 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 elle-même, par exemple, “-oarg”), il est renvoyé dans optarg, sinon optarg est défini sur zéro.

Un exemple de code:

 #include  #include  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 la optssortingng “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 optarg global var. Voir le manuel pour plus de détails et plus d’exemples.

Pour plus d’un commutateur d’options de caractères, voir les options longues getopt_long . Consultez le manuel pour des exemples.

EDIT en réponse aux options ‘-‘ longues:

Des 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 par “-“) ne correspond pas à une option longue, mais à une option courte, elle est analysée comme une option courte.

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  #include  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); }