#include <stdio.h>
int main(void)
{
return 0
}
기본 에디터 프로그램을 설치한 뒤에 C언어를 처음 배우게 되면 보통은 가장 기본적인 구조를 배우게 됩니다
main함수를 작성할때 보통은 비워두거나 void 전달 인자를 사용하는데 void나 공백이라면 아무것도 전달하지 않겠다는 의미입니다
그런데 그거 알고계신가요? main함수에도 별도의 인자가 존재합니다
바로 argc와 argv가 있는데 제가 처음 c언어를 배울 때 main함수에 대한 자세한 개념 공부 없이 바로 printf문부터 시작해서 변수나 함수에 대해 공부했었고 main함수에 argc와 argv라는 매개변수가 존재한다는 건 모르고 있었습니다
main함수의 인자(매개변수) argc,argv
int main(int argc,char *argv[])
기본적으로 main함수 원형은 이렇게 생겼습니다
int argc : main함수에 전달되는 인자의 개수를 의미합니다
몇 개의 인자를 받을 건지 나타내며 기본적으로 데이터 타입은 int형입니다
char *argv[] : main함수에 전달되는 데이터이며 포인터형으로 선언된 이유는 데이터가 담긴 주소의 값을 나타내기 때문에 *실질적인 데이터를 가리키도록 합니다 argv[0] 0번째 주소에는 프로그램의 실행 경로인 절대 경로가 담겨있습니다
1
2
3
4
5
6
7
8
9
10
11
|
//a.c
#include <stdio.h>
int main(int argc,char *argv[]){
printf("실행파일의 절대경로 : %s\n", argv[0]);
for (int i=0;i<argc; i++){
printf("argv[%d]: %s\n",i,argv[i]);
}
return 0;
}
|
cs |
for문을 사용하여 입력받은 문자열만큼 공백을 기준으로 나누어 argc에는 값들의 개수와 argv에는 데이터가 담기게 됩니다
#5 printf를 사용하여 0번째 실행파일의 경로를 출력해주고, #7~#9까지 for문을 통하여 0번째부터 데이터들의 개수가 담긴 argc 수까지 반복하며 argv i번째 인덱스 안에 담긴 데이터를 출력해줍니다
위의 파일을 리눅스에서 실행시켜보겠습니다
리눅스에서는 gcc 코드파일.c -o 저장할 이름 명령을 통하여 컴파일 후에./실행파일 이름으로 c코드를 실행시킬 수 있습니다
현재는 매개변수를 입력하지 않고 실행하였기 때문에 argc는 1이 됩니다
그리고 실행결과는 argc0번째의 프로그램 절대 경로까지만 출력됩니다
이번에는 매개변수를 포함하여 프로그램을 실행해보겠습니다
실행파일 경로 뒤에 hello world를 입력하여./a hello world라고 입력해보았습니다
이럴 경우에 './a', 'hello', 'world'로 나뉘어서 argv에 데이터 값이 담긴 주소 값을 배열 형태로 저장하게 됩니다
즉 argv[0]에는 ./a 실행 경로가 들어가며 그 뒤로 argv[1]에는 hello, argv[2]에는 world가 담기게 된다
예제
간단히 합을 구하는 코드를 통해 응용해봅시다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#include <stdio.h>
int num(int a,int b){
return a+b;
}
int main(int argc,char *argv[]){
int sum;
sum =num(*argv[1]-48,*argv[2]-48);
for (int i;i<argc; i++){
printf("argv[%d]: %s\n",i,argv[i]);
}
printf("계산결과 %d", sum);
return 0;
}
|
cs |
사용자에게 두 수를 입력받고 argv에 담긴 char형을 int형으로 바꿔주기 위해 아스키코드를 활용할 건데 아스키코드값 48부터는 숫자 영역에 해당되는 0~9를 가지고 있기 때문에 숫자 0에 해당하는 48 값에서 char값을 빼주면 int형의 숫자를 얻어낼 수 있다
그래서 *argv[1]-48같은 형식으로 argv의 데이터 문자형을 int형으로 바꾼 뒤에 num함수를 호출하였습니다
5와 8을 매개변수로 넣어주고 num함수를 통해 5와 8을 더한 13이라는 계산 결과가 정상적으로 출력되는 걸 확인할 수 있습니다