apueプログラミングのgetopt,getopt_long使用方法およびインスタンス

6042 ワード

1. getopt
この関数は、コマンドラインパラメータを解析するために使用されます.
1.1. 関数の定義
int getopt(int argc, char * const argv[], const char *optstring);
#include 

最初の2つのパラメータはmain関数の2つのパラメータに設定されます.
optstringは、コマンドが処理する各オプションからなる文字列に設定されます.オプションの後ろにコロン':'が付いている場合、このオプションはパラメータ付きのオプションです.
例:make -f filename -n−fはパラメータ付きのオプションであり、−nはパラメータなしのオプションである.
上記の例を解析するために、以下のように getoptを呼び出すことができる.
c = getopt(argc, argv, "f:n");

この関数の戻り値は、現在見つかっているコマンド・オプションで、すべてのオプションが見つかった場合の戻り値は-1です.
通常、1つのコマンドには複数のオプションがあります.すべてのオプションを取得するには、戻り値が-1になるまでこの関数をループする必要があります.この関数を使用するには、いくつかのグローバル変数を理解する必要があります.
extern char *optarg;
extern int optind, opterr, optopt;
 /*
optarg:         ,optarg     。
optind: argv   。           ,              (argv[optind])
optopt:      argv  ,  optstring     ,               ,
        getopt()  '?',   optopt     。
opterr:        0,    getopt()      。
*/

1.2. ≪インスタンス|Instance|emdw≫
#include 
#include 
#include 

int main(int argc, char *argv[ ])  
{
    int c;
    int flg = 0;
    char filename[256];
    char testdata[256];
   
    if (argc < 2)
    {
        printf("usage:%s [-f filename] [-n] testdata
", argv[0]); return -1; } opterr = 0; while ((c = getopt(argc, argv, "f:n")) != -1) { switch (c) { case 'f': strncpy(filename, optarg, sizeof(filename)-1); break; case 'n': flg = 1; break; case '?': default: printf("usage:%s [-f filename] [-n] testdata
", argv[0]); return -1; } } if (argv[optind] == NULL) { printf("usage:%s [-f filename] [-n] testdata
", argv[0]); return -1; } else { strncpy(testdata, argv[optind], sizeof(testdata)-1); } printf("fliename:%s flg:%d testdata:%s
", filename, flg, testdata); return 0; }

2. getopt_long
これは、長寿命オプションをサポートする関数で、長オプションは'--'で始まります.
2.1. 関数の定義
int getopt_long(int argc, char * const argv[],
                  const char *optstring,
                  const struct option *longopts, int *longindex);
#include 

最初の3つのパラメータは関数getoptのパラメータと同じです.長いオプションのみがサポートされている場合、パラメータoptstringはNULLまたは空の文字列「」に設定されます.4番目のパラメータは構造体struct optionの配列である.この構造体は、ヘッダファイルgetoptに定義.h中.この配列の最後にメンバーを0にする必要があります.
struct option {
const char *name;
int has_arg;
int *flag;
int val;
};

コンストラクションの各メンバーの解釈は、name:長いオプションの名前です.has_arg : no_Argumentまたは0は、このオプションにパラメータがないことを示します.required_Argumentまたは1は、このオプションにパラメータが付いていることを示し、optional_Argumentまたは2は、オプションであることを示します.flag:NULLに設定した場合、getopt_long()はvalを返し、NULL以外に設定した場合、>getopt_long()は0を返し、*flagをvalに設定します.val:戻り値または*flagの設定値.一部のコマンドでは、ロングオプションとショートオプションの両方がサポートされています.この値をショートオプションに設定することで実現できます.
5番目のパラメータは出力パラメータで、関数getopt_long()が返されると、longindexの値はstruct option配列のインデックスです.
戻り値については、次のような状況があります.
ショートオプションとして認識された場合、戻り値はこのショートオプションです.
長いオプションと認識された場合、flagがNULLの場合はval、flagがNULLでない場合は0を返します.
すべてのオプションの解析が終了すると、-1が返されます.
認識できないオプションが存在するか、パラメータオプション付きのパラメータが存在しない場合は'?'を返します.
2.2. ≪インスタンス|Instance|emdw≫
#include      /* for printf */
#include     /* for exit */
#include 

int main(int argc, char **argv) 
{
   int c;
   int digit_optind = 0;
   int flag = 0;
   
   while (1) {
       int this_option_optind = optind ? optind : 1;
       int option_index = 0;
       static struct option long_options[] = {
           {"add",     required_argument, 0,  0 },
           {"append",  no_argument,       0,  0 },
           {"delete",  required_argument, 0,  0 },
           {"verbose", no_argument,       0,  0 },
           {"create",  required_argument, 0, 'c'},
           {"file",    required_argument, 0, 'f'},
           {0,         0,                 0,  0 }
       };
   
       c = getopt_long_only(argc, argv, "abc:d:f:012", long_options, &option_index);
       if (c == -1)
           break;
   
       switch (c) {
       case 0:
           printf("option %s", long_options[option_index].name);
           if (optarg)
               printf(" with arg %s", optarg);
           printf("
"); break; case '0': case '1': case '2': if (digit_optind != 0 && digit_optind != this_option_optind) printf("digits occur in two different argv-elements.
"); digit_optind = this_option_optind; printf("option %c
", c); break; case 'a': printf("option a
"); break; case 'b': printf("option b
"); break; case 'c': printf("option c with value '%s'
", optarg); break; case 'd': printf("option d with value '%s'
", optarg); break; case 'f': printf("option f with value '%s'
", optarg); break; case '?': break; default: printf("?? getopt returned character code 0%o ??
", c); } } if (optind < argc) { printf("non-option ARGV-elements: "); while (optind < argc) printf("%s ", argv[optind++]); printf("
"); } exit(EXIT_SUCCESS); }

私の微信公衆番号【MySQLデータベース技術】に注目してください.