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

ad 옵션이 예상대로 반환되었습니다. f 플래그 뒤에 지정된 파일 이름도 보고되고 iy 옵션은 ? 범주에 속하며 알 수 없는 명령으로 인식되었습니다.

여기서, 우리는 위에서 설명한 시나리오 외에도 getopt() 함수 뒤에 추가한 마지막 루프가 함수에 의해 처리되지 않은 나머지 인수(testingstringnot_an_option)를 처리한다는 것을 알 수 있다.