web-dev-qa-db-fra.com

Getopt - Passer le paramètre de chaîne pour l'argument

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;  
    }
}
11
AndroidDev93

Lis man getopthttp://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.

20
phoxis

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);
}
15
David M. Syzdek