2017-11-15 1 views
0

getopt()를 사용하여 명령 줄 인수를 구문 분석하려고합니다. 아래는 제 코드입니다. getopt()는 프로그램을 실행할 때 전달한 인수에 관계없이 항상 -1을 반환합니다. 예를 들어getopt는 항상 -1/getopt를 반환하지 않습니다.

:

$ gcc -o test test.c 
$ ./test f 

아무도 내가 뭘 잘못 볼 수 있을까요? 고맙습니다.

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

void usage (char * progname) 
{ 
    fprintf(stderr, "Usage Instructions Here ...\n"); 
    exit(-1); 
} 


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

    while((opt = getopt(argc, argv, "?hf:")) != -1) { 
     switch(opt) { 
      case '?': 
      case 'h': 
       usage(argv[0]); 
       break; 
      case 'f': 
       { 
        FILE *fp; 
        char *filename = strdup(optarg); 

        if((fp = fopen(filename, "r")) == NULL) { 
         usage(argv[0]); 
        } 
       } 
       break; 
      default: 
       fprintf(stderr, "Error - No such opt, '%c'\n", opt); 
       usage(argv[0]); 
     } 
    } 

    return(0); 
} 
+0

그래서 .. 어떻게 실행하는지 몇 가지 예가 무엇입니까? –

+1

옵션은'-' 또는'--'로 시작해야합니다. –

답변

1

당신은 실제로 여기에 옵션을 전달하지 않는 : 옵션이 - 문자로 시작 할 것으로 예상된다

$ ./test f 

. f은 옵션이 아닌 것으로 간주됩니다. 이처럼 호출하는 경우 :

$ ./test -f 

을이를 얻을 수 있습니다 :

./test: option requires an argument -- 'f' 
Usage Instructions Here ... 

는 또한, ? 문자 getopt에 특별한 의미가 있습니다. 알 수없는 옵션이 발견되면 무효 옵션 사본을 optopt에 저장하여 반환합니다. 그래서 당신은 아마 당신의 옵션 문자열에 ?을 사용하고 싶지 않을 것입니다.

+0

그래서'?'와'optopt'와 관련해서 나는'case '?':'를 제거해야하고'fprintf (stderr, "Error - opt, '% c'\ n", opt); – Smaointe

+0

@Smaointe 예, 기존의'case '를 제거 하시겠습니까?':','default'의 대소 문자를''fprintf (stderr, "오류 - 아니요, opt, '% c'\ n", optopt) case '?':','optopt'를 출력합니다. – dbush

관련 문제