Passion/Programming

getopt 사용하기

sunshout 2007. 3. 3. 02:12
프로그램을 짜다 보면 시작시 인자를 받을 때가 많다.

이 인자는 argv를 통해서 받는데
소시적에는 이러한 인자의 순서를 정하고 이에 맞춰서 인자들이 제대로 들어왔는지를 하드코딩을 했다.

그건 물론 아무도 getopt을 쓰면 좀더 잘 짤 수 있다고 말해준 친구들이 없었기 때문이지만 ㅡ,ㅡ

간단하게 getopt을 사용하는 방법에 대해서 정리를 해보겠다.

참조는 man 3 getpot을 하면 된다.
*********************************************
include 해야하는 파일 : unistd.h

extern char *optarg;
extern int optind;
extern int optopt;
extern int opterr;
extern int optreset;

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

* optstring
optstring 은 커멘드에서 받는 옵션들의 문자들을 적는다.
옵션의 종류는 크게 두가지로 구분할 수 있다.
1) on / off 성 옵션들 : -h 등 옵션 문자만 온다
2) string 이 있는 옵션 : -a 123 등의 옵션과 옵션의 값이 존재한다. (-a 123 와 -a123) 은 동일하다.

어떤 옵션들을 받는다는 것을 정의하는 것이 optstring에 넣는 값이다.
1)과 같은 형태는 optstring에 "h" 라고 정의하면 되고, 2와 같은 형태는 "a:" 과 같이 :를 붙임으로써 뒤에 스트링을 받음을 명시한다.
여러개의 옵션들을 받을 경우도 있기 때문에 optstring 에 "ha:" 이렇게 받을 옵션들을 모두 나열하면 된다.

getopt() 이 리턴될 대 optarg에 어떤 옵션이 선택되었는지가 들어간다.
getopt() 함수가 -1을 리턴하면 전체 옵션이 모두 검사되었음을 표시한다.

#include <unistd.h>

static const char usgtxt[] =
"Usage : xxx [-h] [-a] [-b <string>] input file\n"
"Options:\n"
"  - h   print this help\n"
"  - a   set aaaaa\n"
"  - b   set string as bbbbbb\n";


int
main(int argc, char *argv[])
{
    int opt;
    while ((opt = getopt(argc, argv, "ab:h")) != -1)
       switch (opt) {
          case 'a':
             // do assign
             // flag option (on / off)
             break;
          case 'b':
             // do assign
             // string option
            
             break;
          case 'h':
             fprintf(stderr, usgtxt);
             exit(0);
        }
    argc -= optind;
    argv += optind;

    // do body
}