본문 바로가기

Studying/Computer Programs

Command-line arguments (C/C++ 명령행 인자)

C언어 또는 C++ 의 메인 (main)함수를 특별한 방법으로 정의해서, 프로그램을 실행시킬때 커맨드 라인에서 문자열들을 전달해줄 수 있습니다. 그러면 이들이 명령행 인자에 저장되어 프로그램 내에서 사용이 가능하게 되죠. 대표적으로 커맨드라인에 들어가는 인자의 갯수를 세는 정수형 변수와 인자들을 저장하는 문자열들이 있습니다.

int main(int argc, char *argv[]) {
    // .... 프로그램 내용
}


이렇게 해서 컴파일 한 뒤에 실행시킬때,

$./[실행파일 이름] [옵션1] [옵션2] ...

이렇게 옵션들을 지정해 주면, 그 갯수와 값들이 argcargv라는 변수들 안에 저장됩니다.
argc = 옵션의 갯수에 1을 더한 값 (정수)
argv[i] = i-번째 옵션의 값 (문자열) / i 는 1부터 argc-1 까지의 값을 가질 수 있고,
실행파일의 이름은 argv[0]에 저장됩니다.

예를 들어서 input.dat라는 파일에서 데이터를 받아와서 처리한 다음에,
output.dat라는 파일에 기록하는 프로그램을 run.exec이라는 실행파일로 만들었다면,
프로그램 소스코드 안에서 파일 이름을 지정해주는 대신 위에 나온 방법을 써서

$./run.exec input.dat output.dat

라고 실행시킴으로써, 프로그램의 자유도(?)를 높이는 게 가능하겠죠.
이렇게 해서 문자열 "input.dat""output.dat"argv[1]argv[2]에 각각 저장이 되면, 이것들을 메인함수 내에서

 

#include<stdio.h>

int main(int argc, char *argv[]) {
    // ... 프로그램 내용

    FILE *fin;
    FILE *fout;

    fin = fopen(argv[1], "r");
    fout = fopen(argv[2], "w");
    
    // ... 프로그램 내용
    
    fclose(fin);
    fclose(fout);
    
    return 0;
}

 

와 같이 쓸수가 있겠습니다.

추가적으로 명령행 인자로 옵션을 주지 않는 경우를 대비해서 기본값을 프로그램 내에서 정의해 두는 것도 가능한데요. 명령행 인자의 개수인 argc의 값을 체크함으로써 이를 구현할 수 있습니다.

 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(int argc, char *argv[]) {
    // ... 프로그램 내용
    
    char filename_in[200];  // 입력파일 이름
    char filename_out[200];  // 출력파일 이름

    bool fname_arg_in = argc >= 2;
    if (fname_arg_in) {
        strcpy(filename_in, argv[1]);
    } else {
        strcpy(filename_in, "input.dat");
    }

    bool fname_arg_out = argc >= 3;
    if (fname_arg_out) {
        strcpy(filename_out, argv[2]);
    } else {
        strcpy(filename_out, "output.dat");
    }

    FILE *fin;
    FILE *fout;

    fin = fopen(filename_in, "r");
    fout = fopen(filename_out, "w");
    
    // ... 프로그램 내용
    
    fclose(fin);
    fclose(fout);
    
    return 0;
}

 

이렇게 하면, 명령행 인자가 3개보다 작을 경우 출력 파일의 이름은 output.dat라는 기본값으로 정해집니다. 또한 명령행 인자가 2개보다 작을 경우, 즉 실행파일의 이름 1개만 있으면 입력파일의 이름 역시 input.dat라는 기본값으로 정해지게 되죠.

 

명령행 인자들은 기본적으로 문자열의 형태로 저장되기 때문에, 문자열을 다루는 함수들과 연계해서 사용하면 시너지 효과가 날 것입니다. C언어에서 문자와 문자열을 다루는 방법에 대한 더 자세한 사항은 다음 포스팅에 소개되어 있습니다.

 

 

C언어 문자와 문자열 사용하기

여기서는 C언어 프로그램에서 문자와 문자열을 다루는 방법에 대해 살펴보겠습니다. 컴퓨터는 이진수를 다루는 기계이지만, 인간에게 가장 친숙한 건 알파벳 같은 문자들이죠. 컴퓨터도 결국

swstar.tistory.com

 


 

같이 알고 있으면 좋은 C/C++ 팁들

 

함수를 인자로 사용하기

 

C/C++ 에서 함수를 매개변수로 사용하기

일반적으로 C언어나 C++ 에서 사용하는 함수의 경우, 인자(매개변수) 혹은 파라미터로 변수를 받아갑니다. 이 값들을 가지고 정의된 기능을 수행하게 되죠. 하지만 프로그램을 만들다 보면 함수

swstar.tistory.com

 

포트란과의 하이브리드

 

C/C++와 Fortran을 조합한 프로그래밍

수치계산을 위한 프로그램을 짜다 보면, 포트란 함수를 C 혹은 C++ 에서 쓰거나, 그 반대의 경우가 생길 때가 있습니다. 특히 역사가 좀 오래된 모델을 가져다 쓸 때 그렇죠. C언어에서 함수를 특

swstar.tistory.com

 

라이브러리 제작

 

C언어 라이브러리 만들기

자주 쓰는 함수들을 라이브러리 형태로 만들어 두면, 프로그램을 짤 때 편리합니다. 예를 들어서 함수 Function이 mylib.c 라는 소스코드에 정의되어 있고, 프로토타입이 mylib.h 라는 헤더 파일에 선

swstar.tistory.com

 

동적 메모리 할당 (malloc)

 

C 언어의 malloc 함수

학부때부터 수치계산 할때면 항상 C언어를 써 왔지만, 배열과 포인터의 등가관계에 대해서는 극히 최근에야 알게 되었다. 예를 들어서 1) double a[10]; 을 선언했다면, 배열의 이름 a는 포인터 변수

swstar.tistory.com