난 형태로 명령 줄 인수를 필요로하는 프로그램이 있습니다은 "some_other_file"인수가 -t에 바인딩되지가 선행되지 인수 구하는 방법 '-'또는 '-'
./my_program -m256M -tm -t some_other_file
을 (-t 그것은 단지 또 다른 기능입니다.) 그래서 플래그의 optarg로 가져갈 수 없습니다. 둘 다 목록의 마지막 인수라고 생각할 수 없습니다.
어떻게하면됩니까?
감사합니다.
난 형태로 명령 줄 인수를 필요로하는 프로그램이 있습니다은 "some_other_file"인수가 -t에 바인딩되지가 선행되지 인수 구하는 방법 '-'또는 '-'
./my_program -m256M -tm -t some_other_file
을 (-t 그것은 단지 또 다른 기능입니다.) 그래서 플래그의 optarg로 가져갈 수 없습니다. 둘 다 목록의 마지막 인수라고 생각할 수 없습니다.
어떻게하면됩니까?
감사합니다.
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 로의 간단한 루프를 사용하여 이러한 분석되지 않은 인수를 나열 할 수 있습니다.
그게 뭡니까? $ gcc가 dsad.c & & ./a.out -m256M -tm -t some_other_file more_file
some_other_file
more_file
$ gcc가 dsad.c & & ./a
.out -m256M -tm -tint 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; }
$ gcc dsad.c & & ./a.out -m256M -tm -t some_other_file - 기타 some_other_file
아니요. "some_other_file"이 마지막 것임을 가정하고 시작합니다. 그러나 그런식이 아닙니다. 조건이 그 이후의 모든 인수를 건너 뛸 경우. –
위의 코드는 "some_other_file"이 마지막 것임을 가정하지 않습니다. 그것을 밖으로 시도하십시오. –
더 이상 '_'을 찾지 못하면 for 루프를 깨뜨릴 수 있습니다. –
이것은 OP가 이미'getopt '를 사용하고 있기 때문에이 두 가지 중 더 나은 대답입니다. – caf