- /* long_option.c */
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <getopt.h>
-
- void print_help(void);
- void plus(void);
-
- struct option long_options[] = {
- {"help", no_argument, 0, 'h'},
- {"math", no_argument, 0, 'm'},
- {0, 0, 0, 0},
- };
-
- int main(int argc, char **argv)
- {
- int opt, opt_index = 0;
- int help_flag = 0;
- int math_flag = 0;
-
- if(argc < 2)
- print_help();
-
- while((opt = getopt_long(argc, argv, "hma:", long_options, &opt_index)) != EOF) {
- switch(opt) {
- case 'h':
- help_flag = 1;
- break;
- case 'm':
- math_flag = 1;
- break;
- case '?':
- help_flag = 1;
- break;
- default:
- help_flag = 1;
- break;
- }
- }
-
- if(help_flag)
- print_help();
-
- else
- if(math_flag)
- plus();
-
- return 0;
- }
-
- void print_help(void) {
- printf("Usage: ./long_opt [OPTION]\n");
- printf("-m, --math : 加算\n");
- printf("-h, --help : ヘルプを表示\n");
- exit(EXIT_SUCCESS);
- }
-
- void plus(void) {
- int na, nb, nc;
- char tmp[32];
-
- printf("Number A : ");
- fgets(tmp, 32, stdin);
- na = atoi(tmp);
-
- printf("Number B : ");
- fgets(tmp, 32, stdin);
- nb = atoi(tmp);
-
- nc = na + nb;
-
- printf("%d + %d = %d\n", na ,nb, nc);
- }
/* long_option.c */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <getopt.h>
void print_help(void);
void plus(void);
struct option long_options[] = {
{"help", no_argument, 0, 'h'},
{"math", no_argument, 0, 'm'},
{0, 0, 0, 0},
};
int main(int argc, char **argv)
{
int opt, opt_index = 0;
int help_flag = 0;
int math_flag = 0;
if(argc < 2)
print_help();
while((opt = getopt_long(argc, argv, "hma:", long_options, &opt_index)) != EOF) {
switch(opt) {
case 'h':
help_flag = 1;
break;
case 'm':
math_flag = 1;
break;
case '?':
help_flag = 1;
break;
default:
help_flag = 1;
break;
}
}
if(help_flag)
print_help();
else
if(math_flag)
plus();
return 0;
}
void print_help(void) {
printf("Usage: ./long_opt [OPTION]\n");
printf("-m, --math : 加算\n");
printf("-h, --help : ヘルプを表示\n");
exit(EXIT_SUCCESS);
}
void plus(void) {
int na, nb, nc;
char tmp[32];
printf("Number A : ");
fgets(tmp, 32, stdin);
na = atoi(tmp);
printf("Number B : ");
fgets(tmp, 32, stdin);
nb = atoi(tmp);
nc = na + nb;
printf("%d + %d = %d\n", na ,nb, nc);
}
下記の部分がプログラムのメイン
加算する関数とかあるけどぶっちゃけなんでもいい
- struct option long_options[] = {
- {"help", no_argument, 0, 'h'},
- {"math", no_argument, 0, 'm'},
- {0, 0, 0, 0},
- };
-
- ...
-
- while((opt = getopt_long(argc, argv, "hma:", long_options, &opt_index)) != EOF) {
- switch(opt) {
- case 'h':
- help_flag = 1;
- break;
-
- ...
- }
- }
struct option long_options[] = {
{"help", no_argument, 0, 'h'},
{"math", no_argument, 0, 'm'},
{0, 0, 0, 0},
};
...
while((opt = getopt_long(argc, argv, "hma:", long_options, &opt_index)) != EOF) {
switch(opt) {
case 'h':
help_flag = 1;
break;
...
}
}
"getopt_long"関数の第4引数に"long_options"構造体を参照しています.
構造体の第1変数は(char)型の変数, オプションの名前
第2変数は(int)型の変数, "argment"を必要とするかどうか.
第3変数は(int)*型の変数, ロングオプションに対する結果の返し方の指定.
第4変数は(int)型の変数, 返り値, またはflagがポイントする変数へロードされる値
内容はほぼ"getopt"と変わらない. ロングオプションをつけたい場合にのみ使用してください.
実行例
$ ./long --math
Number A : 3
Number B : 4
3 + 4 = 7
$ ./long --help
Usage: ./long_opt [OPTION]
-m, --math : 加算
-h, --help : ヘルプを表示