뇌 마음 반반저장소

[42] argc, argv 거 어떻게 쓰는 겁니까? 본문

좌뇌/왕초보의 컴퓨터 언어 세계

[42] argc, argv 거 어떻게 쓰는 겁니까?

맹진저 2022. 12. 4. 20:00
728x90

argc, argc는 개발자들이 테스트를 위해서 디버깅하기 위해서 쓴다고 한다..! (피신 때 친구들이 이거 꼭 곡 부하고 시험보라그래서 미리 찾아보고 살았던 기억이 있었더랬죠..)

 

1. 기초부터 살펴보기

그럼 이 함수의 원형을 한번 살펴보자.

int	main(int argc, char **argv) //1번
int	main(int argc, char *argv[])
int	main(int ar, char **av) //2번

메인은 함수를 반환해주는 형이다. main 앞에 붙은 int는 "이 함수에서 반환되는 리턴 값은 int로 나올 거예요~ "라는 뜻이다.

 

일반적으로 return (0); 이렇게 마무리를 하는데 그 말인즉슨 "0이면 정상적으로 끝났어요(참)!" 다른 숫자가 나오면 "정상이 아니에요!(거짓)"이라는 뜻이다. 그리고 보통 int main() 이렇게 테스트를 많이 하는데 이 뜻은 인자를 넣지 않겠다, void(비었다)라는 뜻이다.

 

1번은 원래 쓰는 방식이 2번은 보통 저렇게 줄여서 사용한다. int형 변수가 하나 들어오고, char형 변수가 2차원 배열로 들어오는 걸 볼 수 있다.

 

argc는 Argument count의 줄임말이고, argc는 Argument Vertor의 줄임말이다.

위에 2번처럼 줄여서 변수명을 사용한 것처럼 바꿔서 쓸 수 있다. 

 

그렇다면 우리는 터미널에 어떻게 입력해야 할까?

>./a.out 23 45 hello 76

리눅스 기준 ./a.out 혹은 내가 makefile로 정해준 프로그램의 이름을 먼저 입력하고 그 뒤에 대입하고 싶은 것들을 넣으면 된다. (makefile로 내 프로그램 파일 이름 정하기, 2-1 참조)

 

2.int argc

이 변수로 들어오는 것은 숫자이다. argc는 몇 개의 인자가 들어왔는지 세어준다.

위에 터미널에 입력한 인자의 숫자는 총 4개이다. 하지만 이 친구는 프로그램의 숫자까지 포함해서 세어준다. 그래서 총 5개라고 인식을 하게 된다! 참 쉽쥬?

#include <stdio.h>

int main(int ac, char **av)
{
    int i;

    i = 0;
    printf("how many argument? : %d", ac);
    
    return(0);
}

 

> gcc main.c
> .\a.exe hello i am baby developper
how many argument? : 6

2.char **argv

이 변수로 들어오는 것은 문자열이다. 2차원 배열로 들어온다. 그런데 여기서 나는 궁금증이 생겼다. 나는 한 줄로 단어를 썼는데 왜 2차원 배열이 필요할까? 그래서 찾아봤다.

argv is not actually a 2 dimensional array but an array of char *. Each of those pointers point to a string, each of which is a char array, so it can be accessed the same way a 2 dimensional array is.
More specifically, each member of argv is a command line argument passed to the program, with the first member conventionally being the name of the program. Those arguments are strings, and each string is an array of characters. So argv[1][i] grabs the ith character from the first command line argument.

Why do I have to use a two-dimensional array?

위의 stackoverflow 답변에 따르면 argv는 실제로 2차원 배열이 아니라, 2차원 배열과 동일한 방식으로 액세스 한다고 한다.

 

예를 들며 차근차근 살펴보자. 아래와 같이 입력한다면

> gcc main.c
> .\a.exe hello i am baby developper

이런 과정을 거쳐

#include <stdio.h>

int main(int ac, char **av)
{
    int i;

    printf("how many argument? : %d\n", ac); // 6개

    i = -1;    
    while (++i < ac) // 인자 숫자 [0] [1] [2] [3] [4] [5] < 6
        printf("array %d : %s\n", i, av[i]);

    return(0);
}

이런 결과가 나올 것이다!

how many argument? : 6
array 0 : C:\Users\MJi\Desktop\Ecole\복습\a.exe
array 1 : hello
array 2 : i
array 3 : am
array 4 : baby
array 5 : developper

 

그렇다면 2차원 배열을 써서 나타내면 어떻게 나올까?

#include <stdio.h>

int main(int ac, char **av)
{
    int i;
    int j;

    printf("how many argument? : %d\n", ac);

    i = 0;   
    while (++i < ac)
    {
        printf("total array %d : %s\n", i, av[i]);
        j = -1;
        while (av[i][++j] != '\0')
            printf("argv[%d][%d] : %c\n", i, j, av[i][j]);//아스키 값으로 들어와서 %C
    }
    return(0);
}

결과는!

> gcc -Wall -Wextra -Werror main.c  
> .\a.exe hello i am baby developper
how many argument? : 6
total array 1 : hello
argv[1][0] : h
argv[1][1] : e
argv[1][2] : l
argv[1][3] : l
argv[1][4] : o
total array 2 : i
argv[2][0] : i
total array 3 : am
argv[3][0] : a
argv[3][1] : m
total array 4 : baby
argv[4][0] : b
argv[4][1] : a
argv[4][2] : b
argv[4][3] : y
total array 5 : developper
argv[5][0] : d
argv[5][1] : e
argv[5][2] : v
argv[5][3] : e
argv[5][4] : l
argv[5][5] : o
argv[5][6] : p
argv[5][7] : p
argv[5][8] : e
argv[5][9] : r

이렇게 배열에 한 단어씩 담기게 된다는 것!

 

앞으로 쓸 일이 많으니 잊어버리면 다시 들어와서 확인하자 @_@

 

 

728x90
Comments