2013-07-26 14 views
8

Ich habe ein Programm, das mehrere Befehlszeilenargumente nimmt, so dass ich getopt verwenden. Eines meiner Argumente nimmt eine Zeichenfolge als Parameter auf. Gibt es trotzdem einen String durch die getopt-Funktion oder müsste ich ihn über das Array argv [] erhalten? Kann auch lesen args wie -file lesen? Alle Argumente, die ich bis jetzt gesehen habe nur einen Charakter wie -aGetopt- übergeben Zeichenfolge Parameter für Argument

EDIT

Von den unten Antworten, die ich geschrieben habe, ein Programm zu verwenden getopt_long(), aber die switch-Anweisung erkennt nur das Argument, wenn Ich benutze das Argument character und nicht das Argument long. Ich bin mir nicht sicher, warum das passiert. Beim Übergeben der Argumente -mf -file sample sehe ich die print-Anweisungen nicht.

EDIT

ich versucht, die Befehlsargumente als --file Eingabe und arbeitete dann. Ist das nicht möglich mit -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; 
    } 
} 

Antwort

15

lesen man getopthttp://linux.die.net/man/3/getopt

optstring ist eine Zeichenfolge, die legitime Option Zeichen enthält. Wenn solch ein Zeichen von einem Doppelpunkt gefolgt wird, erfordert die Option ein Argument, so platziert getopt() einen Zeiger auf den folgenden Text im selben argv-Element oder den Text des folgenden argv-Elements in optarg . Zwei Doppelpunkte bedeuten, dass eine Option ein optionales Argument verwendet. Wenn Text im aktuellen argv-Element vorhanden ist (d. h. im selben Wort wie die Option name selbst, zum Beispiel "-oarg"), wird es in optarg, zurückgegeben, andernfalls wird optarg auf Null gesetzt.

Ein Beispielcode:

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

Hier im optstring ist "i: o:" Doppelpunkt ':' Zeichen nach jedem Zeichen in der Zeichenfolge sagt, dass diese Optionen ein Argument erforderlich. Sie können das Argument als String in der globalen Variablen optarg finden. Siehe Handbuch für Details und weitere Beispiele.

Für mehr als ein Zeichen Option schaltet, siehe die langen Optionen getopt_long. Überprüfen Sie das Handbuch auf Beispiele.

EDIT als Reaktion auf die einzelnen '-' lange Optionen:

Von den Manpages

getopt_long_only() ist wie getopt_long(), aber '-' sowie „- - "kann eine lange Option anzeigen. Wenn eine Option, die mit '-' (nicht "-") beginnt, nicht mit einer langen Option übereinstimmt, aber mit einer kurzen Option übereinstimmt, wird stattdessen als kurze Option analysiert.

Überprüfen Sie das Handbuch und versuchen Sie es.

+0

ich versucht habe getopt_long verwenden, aber mein Programm erkennt nicht, die die Argumente. Ich habe meinen Code oben hinzugefügt. – AndroidDev93

+0

@ AndroidDev93: Überprüfen Sie meine Bearbeitung – phoxis

8

Um anzugeben, dass ein Flag ein Argument erfordert, fügen Sie direkt nach dem Flag in der Variablen short_opt ein ':' hinzu. Verwenden Sie getopt_long(), um lange Argumente zu verwenden.

Hier ist ein kleines Beispiel-Programm:

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

Gibt es eine Grenze für die Anzahl der verschiedenen Argumente, die ich für getopt_long() verwenden kann? Ich habe 17 verschiedene Argumente und es erkennt nur das Argument, wenn ich die Zeichenversion des Arguments und nicht das lange Argument eingib. – AndroidDev93

+0

Ich glaube, dass Sie nur durch das Gedächtnis begrenzt sind. Aktualisierst du den letzten Wert der long_opts? In meinem Beispiel ist jede lange Option mit einer kurzen Option gekoppelt. Also '--help' und '-h' sind die gleiche Option. Sie können jedoch die Option "--help" mit der Option "-p" gleichsetzen, indem Sie das "h" in "p" ändern und "p" zur Zeichenfolge "short_opt" hinzufügen. –

+1

Ich lese gerade Ihre Änderungen. Sie müssen '--option' anstelle von '-option' verwenden. getopt() und getopt_long() interpretieren '-option' als '-o -p -t -i -o -n'. Wenn Sie lange Optionen mit einem einzigen Bindestrich verwenden möchten, müssen Sie entweder einen eigenen CLI-Argumentparser schreiben oder versuchen, einen vorhandenen zu finden, der Ihrem gewünschten Verhalten entspricht. –

Verwandte Themen