2016-10-20 15 views
1

GNU/Linux 컴퓨터에서 getopt_long을 사용합니다.옵션의 필수 인수가 없다는 것을 어떻게 결정할 수 있습니까?

static struct option long_options[] = { 
    {"mode", required_argument, 0, 9}, 
    {0, 0, 0, 0} 
}; 

내가 명령을 내 프로그램을 실행 코드

c = getopt_long(argc, argv, "", long_options, index_ptr); 

의 다음 줄 유무 : :로 초기화 옵션 목록 '?'코드

prog --mode 

위 라인이 반환을 C에서,하지만 ':'getopt(3) man 페이지에 따라 예상대로 : /분석 짧은 옵션을 사용할 때

예, 하나에서 쓸 수 있었다 "오류 -1 반환 getopt는()의 경우와 동일" 옵션은 ": m :"과 같은 형식을 가지므로 변수가 누락 된 인수에 c에 ':'이 아닌 ':'가 포함되지만 구문 분석시 두 경우 (누락 된 인수, 잘못된 옵션)를 구분하기 위해 수행해야하는 작업은 입니다. 긴 옵션 만?

어떻게 잘못된 옵션과 필수 인수가 누락 된 옵션을 구별 할 수 있습니까? 내가 잘못된 옵션 및 누락 된 인수 유효한 옵션을 구분의 목표를 달성하기 위해 볼 수 있습니다

+0

예를 들면 다음과 같습니다 "9" ? ([긴 옵션 구문 분석 예제] (https://www.gnu.org/software/libc/manual/html_node/Getopt-Long-Option-Example.html#Getopt-Long-Option-Example)을 참조하십시오. –

+0

@DavidBowling '.val'은'int'이지만'.flag' 포인터가 NULL이 아닌 경우 주로 사용됩니다. '9'는 바로 가기 인수를 탐지하는 데 사용할 수 없으므로''m ''(모드)과 같은 문자를 사용하는 것이 좋습니다. –

+0

예, 질문을하기 전에 glibc 참조 설명서의 getopt [_long] 섹션을 읽었습니다. 그러나 그 경우에 무엇이 반환되어야하는지는 명확하지 않다. –

답변

2

있는 유일한 방법은 optional_argument에 옵션 구조체의 has_arg 필드를 설정 한 다음 수동으로 테스트하는 것입니다 논의. 그런 다음 getopt_long()은 '?'값만 반환합니다. 잘못된 옵션이있는 경우 optarg을 보면 지정된 옵션에 인수가 있는지 확인할 수 있습니다. 발 대신 문자 '9'와 왜`optstring이/shortopts` 매개 변수가 포함되지 않은의 반환 할로`long_options` 배열은 9 사용한 이유는

#include <stdio.h> 
#include <stdlib.h> 
#include <getopt.h> 

int main(int argc, char *argv[]) 
{ 
    int i, opt; 
    int index = -1; 

    static struct option long_options[] = { 
     {"mode", optional_argument, NULL, 'm'}, 
     {0, 0, 0, 0} 
    }; 

    /* suppress error messages */ 
    //opterr = 0; 

    while ((opt = getopt_long(argc, argv, "", long_options, &index)) != -1) { 
     if (opt == '?') { 
      /* do something, perhaps: */ 
      //printf("Invalid option \n"); 
      //  exit(EXIT_FAILURE); 
     } 
     if (opt == 'm' && optarg == NULL) { 
      printf("Missing argument in '--mode' option\n"); 
      exit(EXIT_FAILURE); 
     }   
    } 

    return 0; 
} 
+0

나는 그것에 대해서도 생각했다. 문제는 --mode와 같은 옵션이 많은 경우 conditional이있는 몸이 커질 것이라는 점이다. –

+1

@BulatM .-- [Argp] (https://www.gnu.org/software/libc/manual/html_node/Argp.html#Argp)를 사용해 보셨습니까? 'getopt' 스타일의 함수보다 좀 더 복잡해 보이지만, 좀 더 유연 해 보입니다. 그것은 당신이 원하는 것을 할 수있을 것입니다. –