CS 기초/배열

[CS50] 명령행 인자

담크 2021. 8. 10. 19:43

명령행 인자란?

사용자가 명령행에서 명령을 실행할 때 해당 명령과 함께 지정하는 인자를 의미합니다.

지금까지 clang을 사용할 때 -o 옵션을 줘서 a.out이 아닌 사용자가 원하는 이름으로 파일을 컴파일했었는데요 여기에서 - o 를 명령행 인자라고 부릅니다.

그렇다면 make나 clang 이외에 사용자가 작성하는 프로그램에서 명령행 인자를 받을 수 있도록 설계하는 방법에 대해 공부해보도록 하겠습니다.

 

지금까지 코드를 짜면서 매일같이 써온 main함수를 살펴볼까요?

main도 형태를 보자면 하나의 함수인데요 여기서 괄호안에 void대신 다른 형태의 코드를 작성해봅시다.

#include <cs50.h>
#include <stdio.h>

int main(int argc, string argv[])
{
    if (argc == 2)
    {
        printf("hello, %s\n", argv[1]);
    }
    else
    {
        printf("hello, world\n");
    }
}

 

void대신 int argc와 string argv[ ]를 코드로 넣었습니다. 

argc는 main함수가 받게 될 입력의 개수라고 볼 수 있습니다.

argv[ ]는 보시다시피 그 입력이 포함되어있는 배열의 형태를 가지고 있습니다. 프로그램을 명령행에서 실행하려면 입력은 문자열로 해야 하기 때문에 argv[ ]는 string의 배열이 되는 것입니다.

 

그렇다면 if (argc == 2)는 어떤 의미일까요?

argv[0]는 기본적으로 프로그램의 이름으로 저장됩니다.

이렇게 abc.c라는 파일을 만들어 컴파일 후 실행하게 되면 argv[0]번지가 ./abc인걸 볼 수 있죠

이렇게 argc는 기본적으로 1개의 입력이 들어가 있습니다. 그렇다면 명령행 인자 뒤에 값을 추가하면 어떻게 될까요?

명령행 인자 뒤에 Kim이라는 값을 추가하면 입력이 2개가 되겠죠? 그래서 결론적으로 hello, Kim이 출력되는 겁니다.

 

이러한 명령행 인자는 코드를 실행하는 과정에서 데이터를 입력할 수 있기 때문에 프로그램의 확장성에 도움을 줍니다.

예를 들어 어떠한 키워드를 암호화해야 한다고 할 때 암호화에 대한 키값만 코드에 입력해둔다면 코드에 문장을 일일이 입력하지 않더라도 암호화가 가능하게 될 겁니다.

또 위의 보기처럼 들어오는 사용자에게 hello라는 말을 하고 싶으면 hello라는 코드만 넣어두고 뒤의 사용자만 바꿔주면 되기 때문입니다.

 


출처

본 내용은 CS50의 2019년 강의를 듣고 작성했습니다. (개념이 어느 정도 정리되면 최신강의도 다시 듣고 수정할 내용 있으면 수정하겠습니다.)

 

강의 자료는 EdX에서 무료로 사용할 수 있고 boostcourse에서 한글 강의로도 들을 수 있습니다.

'CS 기초 > 배열' 카테고리의 다른 글

[CS50] 문자열의 활용  (0) 2021.08.09
[CS50] 문자열과 배열  (0) 2021.08.08
[CS50] 배열  (0) 2021.08.07
[CS50] 코드의 디자인  (0) 2021.08.06
[CS50] 디버깅  (0) 2021.08.05