2010-04-15 2 views
1

난 형태로 명령 줄 인수를 필요로하는 프로그램이 있습니다은 "some_other_file"인수가 -t에 바인딩되지가 선행되지 인수 구하는 방법 '-'또는 '-'

./my_program -m256M -tm -t some_other_file 

을 (-t 그것은 단지 또 다른 기능입니다.) 그래서 플래그의 optarg로 가져갈 수 없습니다. 둘 다 목록의 마지막 인수라고 생각할 수 없습니다.

어떻게하면됩니까?

감사합니다.

답변

4

getopt는 (_long)이, 같은 방식으로는 argv의 인수의 순서를 무작위로 바꾸어 넣 그것이이 남아가 이해 인수가 없을 때 (이 반환 할 때 -1) 모든 구문 분석 인수는 구문 분석되지 않은 사람 앞에 있습니다. 따라서 전역 변수 optind를 사용할 수 있습니다. getopt는 argv의 첫 번째 인수의 인덱스로 설정합니다. argv는 프로그램에 대한 추가 인수를 찾기 위해 구문 분석하지 않았습니다. getopt에 의해 알려진 인수를 제외하고 하나의 some_other_file이 있다고 가정하면, 의사 코드는 다음과 같습니다

while ((ret = getopt_long(argc, argv, ...)) != -1) { 
    /* do something with ret */ 
} 
if (optind >= argc) { 
    /* error, no some_other_file */ 
} else { 
    file_str = argv[optind]; 
    /* do something else */ 
} 

이 방법은 모든 변수는 argv에 남아있을 보장없는 하이픈 인수, 임의의 수를 확장 할 수 있습니다 이를 통해 getopt가 이해할 수있는 모든 인수를 얻었으므로 optind에서 argc-1 로의 간단한 루프를 사용하여 이러한 분석되지 않은 인수를 나열 할 수 있습니다.

+0

이것은 OP가 이미'getopt '를 사용하고 있기 때문에이 두 가지 중 더 나은 대답입니다. – caf

2

그게 뭡니까? $ gcc가 dsad.c & & ./a.out -m256M -tm -t some_other_file more_file
some_other_file
more_file
$ gcc가 dsad.c & & ./a


int main(int argc, char* argv[]){ 
//... 
int i=1; 

for(; i<argc; i++){ 
    if(argv[i][0] != '-'){ 
     printf("%s\n", argv[i]); 
     //break; //if you dont want all arguments that don't start with - or -- 
    } 
} 

//... 
return 0; 
} 
.out -m256M -tm -t
$ gcc dsad.c & & ./a.out -m256M -tm -t some_other_file - 기타 some_other_file

+0

아니요. "some_other_file"이 마지막 것임을 가정하고 시작합니다. 그러나 그런식이 아닙니다. 조건이 그 이후의 모든 인수를 건너 뛸 경우. –

+0

위의 코드는 "some_other_file"이 마지막 것임을 가정하지 않습니다. 그것을 밖으로 시도하십시오. –

+0

더 이상 '_'을 찾지 못하면 for 루프를 깨뜨릴 수 있습니다. –

관련 문제