[컴퓨터 과학 cs50]함수에서의 명령행 인자(ing argc, string argv[])

2021. 1. 30. 03:04컴퓨터과학/cs50

반응형

들어가기전에

make나 clang과 같은 프로그램을 실행할 때 컴파일하고자 하는 코드 외에도 컴파일 후 저장하고자 하는 파일명과 같이 추가적인 정보를 함께 줄 수도 있습니다. 이런 정보들을 명령행 인자 라고 부릅니다. 우리가 작성하는 프로그램에서도 명령행 인자를 받을 수 있도록 설계할 수 있습니다.

 

stdio.h는 printf와 같은 함수의 프로토타입이 내장되어있다.

그 코드들이 파일의 전처리 과정에서 복사되어 옮겨지는 식이었다.

 

우리가 여태껏 많이 사용해온 main 함수를 보다 자세히 들여다볼 때가 왔습니다.

main도 그 형태를 보면 하나의 함수임을 알 수 있는데요, 이젠 더이상 main() 안에 기계적으로 void 라고 입력하는 대신 아래 코드와 같이 argc, argv 를 정의해보겠습니다.

 

main함수는 두 개의 인자를 받는데, 하나는 int고 또 하나는 정확히 string이 아니라 string의 배열이다.

argv는 관습적인 표현이다. 인자 벡터를 말한다. 인자들의 배열이라는 뜻이다.

배열이라는 건 대괄호를 보면 알 수 있다.

argc라는 int변수로 인자 갯수를 뜻한다.

 

여기서 첫번째 변수 argc는 main 함수가 받게 될 입력의 개수입니다.

그리고 argv[]는 그 입력이 포함되어 있는 배열입니다. 프로그램을 명령행에서 실행하므로, 입력은 문자열로 주어집니다.

따라서 argv[]는 string 배열이 됩니다.

 

  

만약 argc가 2와 같다면, 사용자가 프롬프트에 단어 2개를 입력했다는 뜻이다.

위 프로그램은 프로그램이 실행되고 get_string함수 호출을 기다리는 대신 그냥 명령 프롬프트에 바로 이름을 쓸 수 있도록 프로그램을 작성한 것이다.

 

컴파일하고 실행하면 hello, world라는 출력이 나온다. 이렇게 실행하면 argc의 값은 뭐가 될까?

1일지도 모른다. 적어도 2는 아니다!! 이름을 입력하지는 않았으니까..!!

 

“./argc David”로 실행해보면 “hello, David”라는 값이 출력됩니다.

C로 작성된 프로그램을 실행할 때, 프로그램 이름 뒤에 단어를 입력하면, 그 단어들은 argv라는 배열에 들어간다.

그리고 argc에는 단어의 갯수가 저장이 된다.

 

 

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

만약 하나의 입력이 더 주어진다면 argv[1]에 저장될 것입니다.

예를 들어 위 프로그램을 “arg.c”라는 이름으로 저장하고 컴파일 한 후 “./argc”로 실행해보면 “hello, world”라는 값이 출력됩니다.

명령행 인자에 주어진 값이 프로그램 이름 하나밖에 없기 때문입니다.

하지만 “./argc David”로 실행해보면 “hello, David”라는 값이 출력됩니다.

명령행 인자에 David라는 값이 추가로 입력되었고, 따라서 argc 는 2, argv[1] 은 “David”가 되기 때문입니다.

 

Q. 대체 왜 main함수는 반환값이 있는 걸까요?

특별한 이유는 없다. C의 main함수는 기본적으로 반환값을 가진다. 우리는 아직 반환값을 받아보지 않았지만, main은 0을 반환한다. 컴퓨터에서 0은 보통 문제없음을 의미한다. (좋은의미)

 

int main(void)대신에 int main(int argc, string argv[])을 넣어서 명령어 인자를 받도록 하자!

그 다음에는 에러 체크를 하자! 이 프로그램은 사용자가 명령어 인자를 쓰기를 기대한다!

만약 argc가 2가 아니라면, 사용자에게 명령행 인자가 없다가 말한다. C에서는 값을 반환한다. 문제가 없다면 0을 반환했겠지만, 반면 문제가 있다면 -20억을 반환할 수도 있지만, 간단하게 1을 반환한다.

반면 문제가 없다면, printf를 이용해서 전과 같이 hello와 argv[1]을 출력하고, 문제가 없다는 뜻으로 0을 출력하게 된다.

 

Q. 왜 argc가 2가 아닌지 검사할까?

argv에서는 처음에 입력하는 프로그램의 이름이 argv[0]에 저장이 된다. 그 다음에 입력하는 첫번째 인자가 argv[1]이다.

인자를 하나만 입력한 것처럼 보이지만, 사실은 두 개를 입력했다. 이게 argc가 2여야하는 이유이다.

이걸로 뭘 할 수 있을까?

 

반응형