2015-01-25 24 views
2

나는 나 자신을 가르치기 시작했다. 나는 몇 번의 요동을 겪었지만 지금은 getOpt()에 난처 해한다. 가장 중요한 것은 저에게 문제를 일으키는 것은 특정 플래그를 다른 플래그에 종속 시키려고 할 때입니다. 예를 들어, 다음과 같이 작동 시키려고합니다.getopt()를 사용한 C 프로그래밍 : 명령 줄 플래그 조건 지정

./myfile -a -b -c blue 

그러나 -a없이 작동하는 다른 옵션은 없습니다. 따라서 ./myfile -b -c purple은 유효하지 않습니다. getopt가 이런 종류의 "플래그 종속"기준을 처리 할 수 ​​있습니까? 그 일을 어떻게 하죠? 둘째, 어떤 플래그가 전달 되든 상관없이 색상이어야합니다.

따라서 ./myfile -a -b green./myfile red은 모두 유효합니다. 이 모든 것은 getOpt() (현재 "abc"와 비슷한 것으로 설정되어 있음)의 options 매개 변수 내에 있지만, "a : b : c : 플래그가 전달되지 않으면 필수 색상이 포함되지 않기 때문입니다.

+0

첫 번째 질문 (-a와 함께 만 유효 -b하게는) getopt는 불가능합니다 - 그것은에 그 상황을 확인하기 쉽다 그러나 주어진 매개 변수를 반복 할 때 자신의. – maja

+0

매개 변수를 반복하는 방법은 무엇입니까? 죄송합니다. 다시 C에서 매우 새로운 것입니다. 어떻게 매개 변수를 반복 할 수 있습니까? – sudobangbang

+0

getopt를 사용할 때 항상 매개 변수를 반복합니다. 단순히'getopt '를 여러 번 호출하고있다. (이 함수는 내부적으로 상태를 저장하므로, 다음에 반환 할 매개 변수를 항상 알고 있습니다). abligh 이미 예제를 게시했습니다. – maja

답변

1

여기 getopt의 (맨 페이지에서) 예 : 당신이 어떤 선언을 추가해야합니다

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

int 
main (int argc, char *argv[]) 
{ 
    int flags, opt; 
    int nsecs, tfnd; 

    nsecs = 0; 
    tfnd = 0; 
    flags = 0; 
    while ((opt = getopt (argc, argv, "nt:")) != -1) 
    { 
     switch (opt) 
     { 
     case 'n': 
      flags = 1; 
      break; 
     case 't': 
      nsecs = atoi (optarg); 
      tfnd = 1; 
      break; 
     default:    /* '?' */ 
      fprintf (stderr, "Usage: %s [-t nsecs] [-n] name\n", argv[0]); 
      exit (EXIT_FAILURE); 
     } 
    } 

    printf ("flags=%d; tfnd=%d; optind=%d\n", flags, tfnd, optind); 

    if (optind >= argc) 
    { 
     fprintf (stderr, "Expected argument after options\n"); 
     exit (EXIT_FAILURE); 
    } 

    printf ("name argument = %s\n", argv[optind]); 

    /* Other code omitted */ 

    exit (EXIT_SUCCESS); 
} 

주 및 main() 기능이 작동시킬 수 있습니다.

위의 예 n은 깃발이며 b 옵션처럼 작동합니다. 위의 t 옵션은 매개 변수를 취하고 사용자의 c 옵션처럼 작동합니다. 당신은 또한 플래그 인 a 옵션을하려는 경우 (즉, 콜론없이에 a 추가)를 getopt 매개 변수 "abf:"을 만들 것,이 같은 switch에 연 :

  case 'a': 
       aflag = 1; 
       break; 

처음 가진 aflag을 0으로 설정하십시오. 결국 aflag이 설정되지 않은 상태에서 다른 옵션이 전달 된 불법적 인 조건을 점검하게됩니다.

그래서 모두 모두, 그것은 다음과 같을 것이다 :

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

int 
main (int argc, char *argv[]) 
{ 
    int flags, opt; 
    int nsecs, tfnd; 
    int aflag; 

    nsecs = 0; 
    tfnd = 0; 
    flags = 0; 
    aflag = 0; 
    while ((opt = getopt (argc, argv, "ant:")) != -1) 
    { 
     switch (opt) 
     { 
     case 'a': 
      aflag = 1; 
      break; 
     case 'n': 
      flags = 1; 
      break; 
     case 't': 
      nsecs = atoi (optarg); 
      tfnd = 1; 
      break; 
     default:    /* '?' */ 
      fprintf (stderr, "Usage: %s [-t nsecs] [-n] name\n", argv[0]); 
      exit (EXIT_FAILURE); 
     } 
    } 

    printf ("flags=%d; tfnd=%d; optind=%d\n", flags, tfnd, optind); 

    if (optind >= argc) 
    { 
     fprintf (stderr, "Expected argument after options\n"); 
     exit (EXIT_FAILURE); 
    } 

    if (!aflag && (flags || tfnd)) 
    { 
     fprintf (stderr, "Must specify a flag to use n or t flag\n"); 
     exit (EXIT_FAILURE); 
    } 

    printf ("name argument = %s\n", argv[optind]); 

    /* Other code omitted */ 

    exit (EXIT_SUCCESS); 
}