C언어 또는 C++ 의 메인 (main)함수를 특별한 방법으로 정의해서, 프로그램을 실행시킬때 커맨드 라인에서 문자열들을 전달해줄 수 있습니다. 그러면 이들이 명령행 인자에 저장되어 프로그램 내에서 사용이 가능하게 되죠. 대표적으로 커맨드라인에 들어가는 인자의 갯수를 세는 정수형 변수와 인자들을 저장하는 문자열들이 있습니다.
int main(int argc, char *argv[]) {
// .... 프로그램 내용
}
이렇게 해서 컴파일 한 뒤에 실행시킬때,
$./[실행파일 이름] [옵션1] [옵션2] ...
이렇게 옵션들을 지정해 주면, 그 갯수와 값들이 argc와 argv라는 변수들 안에 저장됩니다.
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++ 팁들
함수를 인자로 사용하기
포트란과의 하이브리드
라이브러리 제작
동적 메모리 할당 (malloc)