C++에서 getopt를 사용하여 인수 처리

Muhammad Husnain 2023년10월12일
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)를 처리한다는 것을 알 수 있다.

Muhammad Husnain avatar Muhammad Husnain avatar

Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.

LinkedIn

관련 문장 - C++ Function