Gae Ko's Blog

[C] Main 함수의 매개변수 (argc, argv) 본문

프로그래밍언어/C

[C] Main 함수의 매개변수 (argc, argv)

Gae Ko 2018. 1. 16. 04:14

암호화 알고리즘 소스코드를 보는데 main( int argc, char* argv[]) 같이 main함수에 매개변수가 있는 형태는 처음 보았다. 

그래서 main 함수의 매개변수에 대해 알아보았다. 


우리는 프로그램을 만들어 실행할 때 늘 같은 조건으로 하지 않는 경우가 있다. 프로그램에 중요한 인자 값을 전달해야 할 때이다. 예를 들어 서버/클라이언트 프로그램을 만들었다고 하자. 클라이언트가 서버에 접속할 때 IP값을 입력해야 한다. 이 때마다 ㅅ스코드를 고쳐서 컴파일 하기엔 번거롭다. 이런 경우에 써먹으려고 main함수에는 인자의 수와 내용을 담을 수 있는 옵션을 제공한다.


보통 C를 처음 배우고 윈도우 상에서 visual studio를 사용하여 프로그램을 작성한다면, main함수의 명령인수는 거의 사용하지 않는다. 그러나 리눅스 계열에서는 종종 사용하기도 하며, 필요에 따라서는 윈도우상에서도 충분히 사용할 수 있다.


1. main함수의 매개변수 


C에서 main함수는 프로그램의 진입점이다. 즉, 최초로 함수로 구동되어 실행하는 시점이다. 함수의 매개변수(파라미터)는 이 함수를 호출할 때 전달해주는 정보를 뜻한다. 우리는 보통 함수를 만들어 놓고 호출할 때에 매개변수에 정보를 넣어준다. 그런데 main함수는 최초로 시작하는 진입점인데 어떻게 정보를 전달해줄까? 


일단 main함수의 원형은 다음과 같다.


int main( int argc, char* argv[])


main 함수에 argc, argv라는 매개변수를 전달한다. 

- int argc : 메인함수에 전달되는 정보의 개수를 의미 (argument count)

- char* argv[] : 메인함수에 전달되는 실질적인 정보로, 문자열의 배열을 의미한다. 인덱스가 0인 문자열은 프로그램의 실행경로로 항상 고정되어 있다.

(argument vector)


다음과 같은 'arg_test.c' 예제를 작성해보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdlib.h>  
#include <stdio.h>  
   
int main(int argc, char *argv[])  
{  
        int i;  
  
        for (i = 0; i < argc; i++)  
                printf("argv[%d]: %s\n", i, argv[i]);  
        exit(0);  
 
 
출처: http://gday2code.tistory.com/72 [우리들의 지식저장소]
cs


매개변수 입력을 하나도 하지 않으면 argc는 1이 된다. 즉, argc는 항상 1이상이 된다.

따라서 입력한 매개변수의 개수는 argc-1 이다.


2. main함수에 정보를 전달하는 방법 


1) 리눅스를 사용한다면 


arg_test.c를 컴파일해서 실행파일을 만들고 

$./arg_test I AM HANUL

라고 실행시켜보자. 다음과 같은 화면을 볼 수 있을 것이다.


argv[0] : ./arg_test

argv[1] : I

argv[2] : AM

argv[3] : HANUL


argc에서 counting되는 인자는 './arg_test', 'I', 'AM', 'HANUL'로 총 5개로 argv에는 문자열로 저장된 인자의 주소값을 배열형태로 저장한다.

즉, argv[0]에는 문자열 'arg_test'의 시작주소값이 저장되고 argv[1]에는 'I'의 시작주소값이 담기게 된다는 뜻이다.


프로그램은 공백을 하나의 인수로 인식한다. 공백을 포함해서 인수를 전달하고 싶다면 작은 따옴표를 이용하면 된다.


$./arg_test I 'AM HANUL'


2) 윈도우를 사용한다면 


명령프롬프트를 사용하는 방법과 visual studio를 사용하는 방법이 있다.




'프로그래밍언어 > C' 카테고리의 다른 글

[C] 포인터  (0) 2018.03.28
[C] 구조체  (0) 2018.03.18
[C] enum 그리고 enum&typedef  (0) 2018.03.10
[C] 표준입력함수 scanf()  (0) 2018.03.10
[C] double형 변수에 대한 절대값 구하기 : fasb()  (0) 2018.03.09