2017-11-15 13 views
0

getopt()を使用してコマンドライン引数を解析しようとしています。以下は私のコードです。 getopt()は、プログラムの実行時に渡す引数に関係なく常に-1を返します。例えばgetoptは常に-1を返しますgetoptは何もしません

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

誰も私が間違っているのかを見ることができますか?ありがとうございました。

#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

だから、どのように実行しているのですか? –

+1

オプションは '-'または' --'で始まります。 –

答えて

1

あなたが実際にここにオプションを渡していない:

$ ./test f 

オプションが-文字で開始することが期待されています。 fはありませんので、オプションとはみなされません。あなたはこのようにそれを呼び出す場合:

$ ./test -f 

あなたはこの得られます。また

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

を、?文字がgetoptに特別な意味を持っています。不明なオプションが見つかった場合に返され、無効なオプションのコピーがoptoptに格納されます。だからおそらくあなたのオプション文字列に?を使用したくないでしょう。

+0

'? 'と' optopt'に関して、 'case'? ':'を削除し、 'fprintf(stderr、" Error - そのようなopt、'%c '\ n "、opt ); '' fprintf(stderr、 "エラー - そのようなオプションはありません、 '%c' \ n"、optopt); ' – Smaointe

+0

@Smaointeはい、既存の' case 'を削除しますか? ':'、 'default'ケースを' case '?': 'と書いて、その場合は' optopt'を出力します。 – dbush

関連する問題