apueプログラミングのgetopt,getopt_long使用方法およびインスタンス
1. getopt
この関数は、コマンドラインパラメータを解析するために使用されます.
1.1. 関数の定義
最初の2つのパラメータはmain関数の2つのパラメータに設定されます.
optstringは、コマンドが処理する各オプションからなる文字列に設定されます.オプションの後ろにコロン':'が付いている場合、このオプションはパラメータ付きのオプションです.
例:
上記の例を解析するために、以下のように
この関数の戻り値は、現在見つかっているコマンド・オプションで、すべてのオプションが見つかった場合の戻り値は-1です.
通常、1つのコマンドには複数のオプションがあります.すべてのオプションを取得するには、戻り値が-1になるまでこの関数をループする必要があります.この関数を使用するには、いくつかのグローバル変数を理解する必要があります.
1.2. ≪インスタンス|Instance|emdw≫
2. getopt_long
これは、長寿命オプションをサポートする関数で、長オプションは'--'で始まります.
2.1. 関数の定義
最初の3つのパラメータは関数getoptのパラメータと同じです.長いオプションのみがサポートされている場合、パラメータoptstringはNULLまたは空の文字列「」に設定されます.4番目のパラメータは構造体struct optionの配列である.この構造体は、ヘッダファイルgetoptに定義.h中.この配列の最後にメンバーを0にする必要があります.
コンストラクションの各メンバーの解釈は、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≫
私の微信公衆番号【MySQLデータベース技術】に注目してください.
この関数は、コマンドラインパラメータを解析するために使用されます.
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データベース技術】に注目してください.