2017-11-15 5 views
0

Ich versuche, Kommandozeilenargumente mit getopt() zu analysieren. Unten ist mein Code. getopt() gibt immer -1 zurück, egal welche Argumente ich beim Ausführen des Programms übergebe.getopt immer zurück -1/getopt nichts tun

Zum Beispiel:

$ gcc -o test test.c 
$ ./test f 

Kann jemand sehen, was ich falsch mache? Vielen Dank.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <getopt.h> 

void usage (char * progname) 
{ 
    fprintf(stderr, "Usage Instructions Here ...\n"); 
    exit(-1); 
} 


int main (int argc, char *argv[]) 
{ 
    int opt; 

    while((opt = getopt(argc, argv, "?hf:")) != -1) { 
     switch(opt) { 
      case '?': 
      case 'h': 
       usage(argv[0]); 
       break; 
      case 'f': 
       { 
        FILE *fp; 
        char *filename = strdup(optarg); 

        if((fp = fopen(filename, "r")) == NULL) { 
         usage(argv[0]); 
        } 
       } 
       break; 
      default: 
       fprintf(stderr, "Error - No such opt, '%c'\n", opt); 
       usage(argv[0]); 
     } 
    } 

    return(0); 
} 
+0

Also .. Was sind die Beispiele dafür, wie Sie es ausführen? –

+1

Optionen sollten mit '-' oder' --' beginnen. –

Antwort

1

Sie sind nicht wirklich vorbei eine Option hier:

$ ./test f 

Optionen werden voraussichtlich mit einem - Charakter starten. f nicht, so wird es nicht als eine Option betrachtet. Wenn Sie es so nennen:

$ ./test -f 

Sie werden diese:

./test: option requires an argument -- 'f' 
Usage Instructions Here ... 

Auch die ? Charakter eine besondere Bedeutung zu getopt hat. Es wird zurückgegeben, wenn eine unbekannte Option gefunden wird und eine Kopie der ungültigen Option in optopt gespeichert ist. Sie möchten wahrscheinlich nicht ? in Ihrer Optionszeichenfolge verwenden.

+0

Also, in Bezug auf "?" Und "optopt", sollte ich 'case 'entfernen?':' Und ich sollte auch 'fprintf ändern (stderr," Error - Nein so opt, '% c' \ n ", opt); 'to' fprintf (stderr, "Fehler - keine solche opt, '% c' \ n", optopt); ' – Smaointe

+0

@Smaointe Ja, entfernen Sie die bestehende' case '?': ', ändern Sie die 'default' case in' case '?': ', und drucke in diesem Fall' optopt'. – dbush