[PR] この広告は3ヶ月以上更新がないため表示されています。
ホームページを更新後24時間以内に表示されなくなります。

getopt

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

with line numberplain text
  1. #include <unistd.h>
  2.  
  3. int getopt(int argc, char * const argv[], const char *optstring);
  4.  
  5. extern char *optarg;
  6. extern int optind, opterr, optopt;
  7. /* getoptは最終的にEOF(-1)を返すようになっています. */
#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

with line numberplain text
  1. /* getopt.c */
  2. #include <stdio.hgt;
  3. #include <stdlib.hgt;
  4. #include <unistd.hgt;
  5.  
  6. void print_help(void);
  7.  
  8. int main(int argc, char **argv)
  9. {
  10.     if(argc  < 2)
  11.         print_help();
  12.  
  13.     int i, opt;
  14.     int help_flag = 0;
  15.     int flags[3] = {0};
  16.     char *flag[] = {
  17.         "l", "m", "n"};
  18.  
  19.     while((opt = getopt(argc, argv, "lnmha:")) != EOF) {
  20.         switch(opt) {
  21.             case 'l':
  22.                 flags[0] = 1;
  23.                 break;
  24.             case 'm':
  25.                 flags[1] = 1;
  26.                 break;
  27.             case 'n':
  28.                 flags[2] = 1;
  29.                 break;
  30.             case 'h':
  31.                 help_flag = 1;
  32.                 break;
  33.             case '?':
  34.                 help_flag = 1;
  35.                 break;
  36.             default:
  37.                 help_flag = 1;
  38.                 break;
  39.         }
  40.     }
  41.  
  42.     if(help_flag)
  43.         print_help();
  44.  
  45.     else
  46.         for(i = 0; i  < 3; i++)
  47.             if(flags[i])
  48.                 printf("%sが指定されました.\n", flag[i]);
  49.  
  50.     return 0;
  51. }
  52.  
  53. void print_help(void) {
  54.     printf("Usage: ./getopt [OPTION]\n");
  55.     printf("\t -h : ヘルプを表示\n");
  56.     printf("\t -l : テスト\n");
  57.     printf("\t -n : テスト\n");
  58.     printf("\t -m : テスト\n");
  59.     exit(EXIT_SUCCESS);
  60. }
/* 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);
}
                            
with line numberplain text
  1. while((opt = getopt(argc, argv, "lmnha:")) != EOF) {
  2.     switch(opt) {
  3.         case 'n':
  4.             flags[0] = 1;
  5.             break;
  6.         ...
  7.     }
  8. }
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 : テスト