getopt

"getopt"は標準ライブラリ関数に含まれています.
この関数は名前の通りにオプションをつけることができます.
実際自分は英語が殆ど読めないので感覚でやっていますが, 詳しく知りたい場合は"man"コマンドかネット上のテキストをご覧ください.

#include <unistd.h>

int getopt(int argc, char * const argv[], const char *optstring);

extern char *optarg;
extern int optind, opterr, optopt;
/* getoptは最終的にEOF(-1)を返すようになっています. */


getopt Example

/* getopt.c */
#include <stdio.hgt;
#include <stdlib.hgt;
#include <unistd.hgt;

void print_help(void);

int main(int argc, char **argv)
{
    if(argc  < 2)
        print_help();

    int i, opt;
    int help_flag = 0;
    int flags[3] = {0};
    char *flag[] = {
        "l", "m", "n"};

    while((opt = getopt(argc, argv, "lnmha:")) != EOF) {
        switch(opt) {
            case 'l':
                flags[0] = 1;
                break;
            case 'm':
                flags[1] = 1;
                break;
            case 'n':
                flags[2] = 1;
                break;
            case 'h':
                help_flag = 1;
                break;
            case '?':
                help_flag = 1;
                break;
            default:
                help_flag = 1;
                break;
        }
    }

    if(help_flag)
        print_help();

    else
        for(i = 0; i  < 3; i++)
            if(flags[i])
                printf("%sが指定されました.\n", flag[i]);

    return 0;
}

void print_help(void) {
    printf("Usage: ./getopt [OPTION]\n");
    printf("\t -h : ヘルプを表示\n");
    printf("\t -l : テスト\n");
    printf("\t -n : テスト\n");
    printf("\t -m : テスト\n");
    exit(EXIT_SUCCESS);
}
                            
while((opt = getopt(argc, argv, "lmnha:")) != EOF) {
    switch(opt) {
        case 'n':
            flags[0] = 1;
            break;
        ...
    }
}
"getopt"の第3引数をオプションの文字列とします.
指定されたオプションが第3引数に存在すれば, "(int)opt"に文字(ASCII Code)が格納され"switch"文が実行されます.
整数の配列の中に"0", "1"しか入らない用にしているのは"if"文に条件式を入れなくて済むためです.


実行例

$ ./getopt -nml
lが指定されました.
mが指定されました.
nが指定されました.

$ ./getopt -h
Usage: ./getopt [OPTION]
-h : ヘルプを表示
-l : テスト
-m : テスト
-n : テスト