HOWTO · C++
C++에서 getopt를 사용하여 인수 처리
이 기사에서는 C++에서 getopt() 함수를 사용하여 인수를 처리하는 방법을 보여줍니다.
이 기사에서는 getopt() 함수를 사용하여 명령줄에서 코드로 전달된 인수를 처리하는 방법을 보여줍니다. 이 튜토리얼은 또한 특정 입력으로 특정 작업을 수행하기 위해 코드를 조작하는 방법을 설명합니다.
C++에서 getopt() 함수를 사용하여 인수 처리
아래에 표시된 코드가 있다고 가정합니다.
// File titled arg_test.cpp
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int opt;
while ((opt = getopt(argc, argv, ":f:asd")) != -1) {
if (opt == 'a' || opt == 's' || opt == 'd') {
printf("Option Selected is: %c\n", opt);
} else if (opt == 'f') {
printf("Filename entered is: %s\n", optarg);
} else if (opt == ':') {
printf("Option requires a value \n");
} else if (opt == '?') {
printf("Unknown option: %c\n", optopt);
}
}
// optind is for the extra arguments that are not parsed by the program
for (; optind < argc; optind++) {
printf("Extra arguments, not parsed: %s\n", argv[optind]);
}
return 0;
}
getopt() 함수의 구문은 다음과 같습니다.
getopt(int argc, char *const argv[], const char *optstring)
argc는 정수이고 argv는 문자 배열입니다. optstring은 각각 단일 문자 길이인 옵션을 나타내는 문자 목록입니다.
함수는 입력의 모든 처리가 완료되면 -1을 반환합니다.
getopt() 함수는 ?를 반환합니다. 인식하지 못하는 것을 만났을 때. 또한 이 인식할 수 없는 옵션은 optopt 외부 변수에 저장됩니다.
기본적으로 옵션에 값이 필요한 경우, 예를 들어 우리의 경우 f 옵션에는 입력 값이 필요하므로 getopt()는 ?를 반환합니다. 그러나 콜론(:)을 optstring의 첫 번째 문자로 배치하면 함수가 ? 대신 :을 반환합니다.
우리의 경우 a, s 또는 d를 입력하면 옵션 자체가 반환되어야 하고 f를 사용하면 인수로 제공된 파일 이름이 반환되어야 하며 다른 모든 것은 유효한 옵션으로 간주되어서는 안 됩니다.
위의 코드를 실행하려면 터미널에서 유사한 명령을 사용할 수 있습니다.
gcc arg_test.cpp && ./a.out
물론 이것을 입력하는 것만으로는 유용한 출력을 얻을 수 없습니다. 예제 사용 사례와 샘플 출력을 입력하고 각 명령이 처리되는 방법을 설명합니다.
예를 들어 다음 명령을 입력하면:
gcc arg_test.cpp && ./a.out -f filename.txt -i -y -a -d testingstring not_an_option
출력으로 다음을 얻습니다.
Filename entered is: filename.txt
Unknown option: i
Unknown option: y
Option Selected is: a
Option Selected is: d
Extra arguments, not parsed: testingstring
Extra arguments, not parsed: not_an_option
a 및 d 옵션이 예상대로 반환되었습니다. f 플래그 뒤에 지정된 파일 이름도 보고되고 i 및 y 옵션은 ? 범주에 속하며 알 수 없는 명령으로 인식되었습니다.
여기서, 우리는 위에서 설명한 시나리오 외에도 getopt() 함수 뒤에 추가한 마지막 루프가 함수에 의해 처리되지 않은 나머지 인수(testingstring 및 not_an_option)를 처리한다는 것을 알 수 있다.