2015-01-24 2 views
0

나는 명령 행 인자를 취하려고 노력 중이다. 여러 개의 선택적인 명령 행 인수를 원한다면 어떻게 할 것인가? 예를 들어, 당신은 다음과 같은 방법으로 프로그램을 실행할 수 있습니다 을 (A 모든 인스턴스를 필요하지만 -b -c -d 부여 할 수 선택적 및 임의의 순서로)C에서 명령 행 인자로 getopt 사용하기

./myprogram -a 
./myprogram -a -c -d 
./myprogram -a -d -b 

내가 그 getopt는을 (알고) '들 세 번째 인수는 옵션입니다. 이 옵션을 "abc"로 설정할 수는 있지만 스위치 케이스를 설정하는 방법에 따라 루프가 각 옵션에서 중단됩니다.

+1

스위치 케이스를 보여줄 수 있습니까? – geekonedge

+0

루프와'switch' 블록을 보여주기 바랍니다. 여러분의 루프가 너무 일찍 종료되기 때문입니다. 일반적으로 루프는'getopt'가 -1을 반환했는지 여부 만 검사하여 반환 값을 변수에 할당하여 'switch' 문에 사용합니다. –

+0

IMO : 명령 줄 인수를 검색하는 가장 좋은 방법은 argc를 사용하여 총 인수 수를 검색하고 * argv []를 사용하여 인수를 검색하는 것입니다. argc는 argv에있는 항목의 개수이고 argv [0]은 프로그램 번호이고 argv [argc]는 명령 행 인수 목록의 끝을 나타내는 널 포인터가됩니다 – user3629249

답변

4

getopt()에 관한 주문은 중요하지 않습니다. 모든 문제는 getopt()로 세 번째 인수 인 : 올바른 (즉 그것은 형식 문자열의) :

추시 형식 문자열이 모두 동일합니다 특정 경우

"c:ba" 
"c:ab" 
"ac:b" 
"abc:" 

, 형식 문자열은 할 필요가 "abcd"과 같은 문과 switch() 문이 제대로 채워집니다.

다음 최소 예제가 도움이 될 것입니다.

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

int 
main (int argc, char **argv) 
{ 
    int aflag = 0; 
    int bflag = 0; 
    char *cvalue = NULL; 
    int index; 
    int c; 

    opterr = 0; 

    while ((c = getopt (argc, argv, "abc:")) != -1) 
    switch (c) 
     { 
     case 'a': 
     aflag = 1; 
     break; 
     case 'b': 
     bflag = 1; 
     break; 
     case 'c': 
     cvalue = optarg; 
     break; 
     case '?': 
     if (optopt == 'c') 
      fprintf (stderr, "Option -%c requires an argument.\n", optopt); 
     else if (isprint (optopt)) 
      fprintf (stderr, "Unknown option `-%c'.\n", optopt); 
     else 
      fprintf (stderr, 
        "Unknown option character `\\x%x'.\n", 
        optopt); 
     return 1; 
     default: 
     abort(); 
     } 

    printf ("aflag = %d, bflag = %d, cvalue = %s\n", 
      aflag, bflag, cvalue); 

    for (index = optind; index < argc; index++) 
    printf ("Non-option argument %s\n", argv[index]); 
    return 0; 
} 
+1

'while' 루프를 쓰지 않겠습니다 'switch'가 논리적으로 단일 문장 인 경우에도 본문 주위에 중괄호가 없습니다. 그것은 세부 사항이지만, 어느 정도 선호되는 부분입니다. 코드는 그렇지 않으면 꽤 좋다. 알 수없는 옵션에 대한보고에 대한 자세한 내용은 인상적입니다! OTOH, 보통'getopt()'가 에러를보고하게합니다 - 나는'opterr = 0;'을 설정하지 않습니다.) 예상되는 사용법을보고하는 것이 좋습니다 : 오류가 감지되면 fprintf (stderr, "사용법 : % s [-ab] [- c 이름] [file ...] \ n", argv [0]); –

+0

미안 해요, C 언어에 익숙하지 않은 이유는 무엇입니까 aflag bflag 등 – sudobangbang

+0

또한 휴식을 경우 여러 플래그를 처리 할 수있는 방법을 이해하지 못하는 것 같아요? 예를 들어 내가 -a -b -c를 ​​호출하면 b와 c의 case 문을 치기 전에 루프를 깨뜨릴 것입니까? – sudobangbang

관련 문제