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

C/C++ 명령줄 인수(Command Line Arguments) 완벽 정리

C 프로그램은 실행될 때 명령줄(command line)에서 값을 전달받을 수 있습니다. 이렇게 전달되는 값들을 명령줄 인수(command line arguments)라고 부르며, 프로그램 내부에 값을 하드코딩하는 대신 외부에서 프로그램의 동작을 제어하고 싶을 때 매우 유용하게 활용됩니다.

명령줄 인수는 main() 함수의 매개변수를 통해 처리됩니다. argc는 전달된 인수의 개수를 나타내고, argv[]는 프로그램에 전달된 각 인수를 가리키는 포인터 배열입니다.

기본 예제

다음 예제는 명령줄에서 인수가 전달되었는지 확인하고, 그 결과에 따라 다른 동작을 수행하는 간단한 프로그램입니다.

#include <stdio.h>
int main( int argc, char *argv[] ) {
    if( argc == 2 ) {
        printf("The argument supplied is %s\n", argv[1]);
    }
    else if( argc > 2 ) {
        printf("Too many arguments supplied.\n");
    }
    else {
        printf("One argument expected.\n");
    }
}

실행 결과 1

$./a.out testing
The argument supplied is testing

인수가 하나만 전달된 경우 argc는 2가 되며, argv[1]에 해당 인수가 저장되어 정상적으로 출력됩니다.

실행 결과 2

$./a.out testing1 testing2
Too many arguments supplied.

인수가 두 개 이상 전달되면 argc가 2보다 커지므로 "인수가 너무 많다"는 메시지가 출력됩니다.

실행 결과 3

$./a.out
One argument expected

아무런 인수도 전달하지 않으면 argc는 1이 되어 기본 메시지가 출력됩니다.

argc와 argv의 구조 이해하기

여기서 중요한 점은 argv[0]에는 프로그램 이름 자체가 저장된다는 것입니다. 즉, 실제 첫 번째 명령줄 인수는 argv[1]부터 시작하며, 마지막 인수는 *argv[n]이 가리킵니다.

  • 인수를 하나도 전달하지 않으면 argc는 1입니다.
  • 인수를 하나 전달하면 argc는 2가 됩니다.

공백이 포함된 인수 전달하기

명령줄 인수는 기본적으로 공백으로 구분되어 전달됩니다. 따라서 인수 자체에 공백이 포함되어 있다면, 해당 인수를 큰따옴표(") 또는 작은따옴표(')로 묶어서 전달해야 합니다.

다음은 프로그램 이름도 함께 출력하고, 공백이 포함된 인수를 큰따옴표로 감싸서 전달하는 예제입니다.

#include <stdio.h>
int main( int argc, char *argv[] ) {
    printf("Program name %s\n", argv[0]);
    if( argc == 2 ) {
        printf("The argument supplied is %s\n", argv[1]);
    }
    else if( argc > 2 ) {
        printf("Too many arguments supplied.\n");
    }
    else {
        printf("One argument expected.\n");
    }
}

실행 결과

$./a.out "testing1 testing2"
Program name ./a.out
The argument supplied is testing1 testing2

큰따옴표로 묶었기 때문에 "testing1 testing2"가 두 개의 별개 인수가 아닌 하나의 인수로 처리되어 argc == 2 조건을 만족하게 됩니다.

정리

명령줄 인수를 활용하면 코드 수정 없이 실행 시점에 프로그램의 동작을 유연하게 변경할 수 있습니다. 핵심은 다음과 같습니다.

  • argc: 전달된 인수의 총 개수 (프로그램 이름 포함)
  • argv[0]: 프로그램 이름
  • argv[1]부터: 실제 전달된 명령줄 인수
  • 공백이 포함된 인수는 따옴표로 묶어서 전달