Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C 언어 getopt() 함수로 명령줄 인수 구문 분석하기

개요

getopt()는 C 프로그램에서 명령줄 옵션(command line options)을 손쉽게 처리할 수 있도록 해주는 표준 라이브러리 함수입니다. unistd.h 헤더에 선언되어 있으며, 프로그램 실행 시 전달된 인수 중에서 하이픈(-)으로 시작하는 옵션 플래그를 하나씩 순서대로 읽어 들입니다.

함수의 기본 구문은 다음과 같습니다.

getopt(int argc, char *const argv[], const char *optstring)

여기서 argcargvmain() 함수가 받은 인수 개수와 인수 배열이며, optstring은 유효한 옵션 문자들의 목록입니다. 각 문자는 하나의 단일 문자 옵션을 의미하고, 옵션이 값을 필요로 한다면 해당 문자 뒤에 콜론(:)을 붙여 표시합니다.

반환값

getopt()는 상황에 따라 다양한 값을 반환합니다.

  • 옵션이 값을 요구하는 경우, 그 값에 대한 포인터가 전역 변수 optarg에 저장됩니다.
  • 더 이상 처리할 옵션이 없으면 -1을 반환하여 옵션 파싱이 끝났음을 알립니다.
  • 인식할 수 없는 옵션이 만나면 '?'를 반환하고, 해당 옵션 문자는 전역 변수 optopt에 저장됩니다.
  • 옵션은 존재하지만 필수 값이 누락된 경우에도 기본적으로 '?'를 반환합니다. 다만 optstring의 첫 번째 문자로 ':'를 지정하면, 값이 없을 때 '?' 대신 ':'를 반환하므로 두 오류 상황을 명확하게 구분할 수 있습니다.

예제 코드

#include <stdio.h>
#include <unistd.h>

main(int argc, char *argv[]) {
    int option;
    // 문자열 맨 앞에 ':'를 넣으면 컴파일러가 '?'와 ':' 반환값을 구분할 수 있습니다.
    while((option = getopt(argc, argv, ":if:lrx")) != -1){ // getopt()에서 옵션을 하나씩 가져옴
        switch(option){
            // i, l, r 옵션인 경우 해당 옵션을 출력
            case 'i':
            case 'l':
            case 'r':
                printf("Given Option: %c\n", option);
                break;
            case 'f': // f는 파일 이름을 받는 옵션
                printf("Given File: %s\n", optarg);
                break;
            case ':':
                printf("option needs a value\n");
                break;
            case '?': // 알 수 없는 옵션 처리
                printf("unknown option: %c\n", optopt);
                break;
        }
    }
    for(; optind < argc; optind++){ // 옵션 외 추가 인수가 전달된 경우
        printf("Given extra arguments: %s\n", argv[optind]);
    }
}

실행 결과

Given Option: i
Given File: test_file.c
Given Option: l
Given Option: r
Given extra arguments: hello

정리

위 예제처럼 getopt()를 활용하면 복잡한 명령줄 인수 처리 로직을 직접 작성하지 않고도 깔끔하게 구현할 수 있습니다. 특히 optarg, optind, optopt 같은 전역 변수들과 함께 사용하면 값이 있는 옵션, 값이 없는 옵션, 잘못된 옵션, 남은 위치 인수까지 체계적으로 처리할 수 있어 유닉스 계열 시스템의 CLI 도구 개발에 매우 유용합니다.