main() 함수에 파라미터를 입력하여 명령어 제작
2026년 수정 안내 원래 실었던 코드에 두 가지 오류가 있었다.
void main은 표준이 아니며(int main이어야 한다),fopen(argv[i])는 인자가 하나 빠져 컴파일되지 않는다. 바로잡고 동작하는 예제로 다시 정리한다.
명령행 인자를 받으려면 main을 다음 형태로 선언한다.
int main( int argc, char* argv[] )
{
return 0;
}
void main은 표준이 아니다. C와 C++ 표준 모두 main의 반환 타입을 int로 규정한다. (MSVC가 관대하게 받아줄 뿐이다.) main에서 return을 생략하면 return 0;이 있는 것으로 처리된다.
argc
프로그램 이름을 포함한 인자의 총 개수다. 인자를 하나도 주지 않고 실행하면 보통 1이고, 파라미터를 2개 주면 3이 된다.
$ ./myapp → argc = 1
$ ./myapp a.txt → argc = 2
$ ./myapp a.txt b.txt → argc = 3
argv
각 인자 문자열의 주소를 담은 배열이다.
argv[0]은 프로그램 이름(또는 실행 경로)이다. 실제 인자는argv[1]부터다.argv[argc]는 항상 널 포인터다. 이걸 이용해 개수 대신 널을 만날 때까지 순회할 수도 있다.
파일을 여는 예제
#include <cstdio>
int main( int argc, char* argv[] )
{
if ( argc < 2 )
{
printf( "usage: %s <file>...\n", argv[ 0 ] );
return 1;
}
for ( int i = 1; i < argc; ++i ) // argv[0]은 프로그램 이름이므로 1부터
{
FILE* fp = fopen( argv[ i ], "r" ); // fopen은 인자가 2개다
if ( fp == nullptr )
{
printf( "cannot open: %s\n", argv[ i ] );
continue;
}
// ... 파일 처리 ...
fclose( fp );
}
return 0;
}
fopen은 파일명과 모드를 함께 받는다. 반환값이 널인지 반드시 확인해야 하고, 연 파일은 fclose로 닫아야 한다.
C++이라면 std::ifstream을 쓰는 편이 낫다. 소멸자가 알아서 닫아준다.
#include <fstream>
#include <string>
#include <vector>
int main( int argc, char* argv[] )
{
const std::vector<std::string> args( argv + 1, argv + argc );
for ( const auto& path : args )
{
std::ifstream file( path );
if ( !file )
continue;
// ... 파일 처리 ...
} // 스코프를 벗어나며 자동으로 닫힌다
return 0;
}
댓글 남기기