
argc argv는 C 언어에서 `main` 함수가 명령줄 인자를 받을 때 쓰는 대표적인 매개변수 이름입니다. 터미널에서 프로그램 뒤에 값을 붙여 실행하면 그 값들이 문자열 목록으로 들어옵니다.
핵심은 argc는 개수, argv는 문자열 목록이라는 단순한 구조입니다. 이 글은 C main 함수와 command-line argument 설명을 기준으로 포인터 배열 감각까지 함께 정리합니다.

argc argv를 먼저 한 줄로 정리하면
`argc`는 명령줄 인자의 개수이고, `argv`는 각 인자 문자열을 가리키는 목록입니다. 이름은 관례지만, C 입문 자료에서는 거의 항상 이 이름으로 설명합니다.
int main(int argc, char *argv[]) {
printf("argc = %d\n", argc);
for (int i = 0; i < argc; i++) {
printf("argv[%d] = %s\n", i, argv[i]);
}
return 0;
}터미널에서 넘긴 값은 문자열로 들어온다
예를 들어 `./memo todo.txt –verbose`처럼 실행하면, 프로그램은 실행 이름과 뒤에 붙은 값을 문자열 목록으로 받습니다.
./memo todo.txt --verbose
argv[0] = ./memo
argv[1] = todo.txt
argv[2] = --verbose보통 `argv[0]`에는 실행한 프로그램 이름 또는 경로가 들어갑니다. 환경에 따라 표현은 달라질 수 있으므로, 핵심 인자는 대개 `argv[1]`부터 확인합니다.
argv는 문자열 배열처럼 읽으면 된다
`char *argv[]`는 문자열을 가리키는 포인터들의 배열처럼 이해할 수 있습니다. 각 `argv[i]`는 하나의 C 문자열을 가리킵니다.
if (argc >= 2) {
printf("file name: %s\n", argv[1]);
}입문 단계에서는 포인터 문법을 너무 깊게 파고들기보다, `argv[번호]`로 n번째 문자열을 꺼낸다고 먼저 잡는 편이 좋습니다.
인자 개수 확인을 먼저 해야 한다
명령줄 인자를 사용할 때 가장 흔한 실수는 `argv[1]`이 있다고 가정하는 것입니다. 사용자가 아무 인자도 넘기지 않으면 접근하면 안 되는 위치를 읽게 됩니다.
int main(int argc, char *argv[]) {
if (argc < 2) {
printf("usage: app <file>\n");
return 1;
}
printf("file: %s\n", argv[1]);
return 0;
}숫자 인자도 처음에는 문자열이다
터미널에서 `10`을 넘겨도 `argv` 안에서는 문자열 `”10″`입니다. 숫자로 계산하려면 변환이 필요합니다.
#include <stdlib.h>
int count = atoi(argv[1]);실무적으로는 오류 처리를 더 세밀하게 할 수 있는 변환 함수를 검토해야 하지만, 입문 단계에서는 문자열로 들어온 뒤 변환한다는 흐름을 먼저 이해하면 됩니다.
언제 argc와 argv가 필요할까
- 파일 이름을 터미널에서 받아 처리할 때
- 간단한 옵션을 붙여 실행 방식을 바꾸고 싶을 때
- 테스트할 값을 코드 수정 없이 바꿔 실행하고 싶을 때
- CLI 도구의 가장 기본적인 입력 방식을 만들 때
실무 체크리스트
- argv를 읽기 전에 argc로 개수를 확인한다
- argv[0]은 사용자 입력값이 아니라 실행 이름으로 본다
- 숫자처럼 보여도 처음에는 문자열이라는 점을 기억한다
- 옵션이 많아지면 직접 파싱보다 전용 파서나 규칙을 검토한다
- 에러 메시지에는 사용 예시를 함께 보여준다
정리
C 언어의 argc와 argv는 명령줄에서 프로그램에 값을 넘기는 가장 기본적인 방법입니다. argc는 개수, argv는 문자열 목록으로 잡고, 실제 인자는 argv[1]부터 확인한다고 이해하면 훨씬 덜 헷갈립니다.
C 포인터와 문자열 흐름은 C 언어 포인터와 배열 차이, C 점 연산자 화살표 연산자 차이, C 언어 문자열과 문자 배열 차이와 함께 보면 좋습니다. 외부 기준은 cppreference – main function, cppreference – Array declaration, cppreference – Pointer를 확인했습니다.