boostcource
모두를 위한 컴퓨터 과학 (CS50 2019) : David J. Malan
www.boostcourse.org/cs11
실습환경 : CS50 Sandbox & CS50 IDE
명령행 인자
이전까지 CS50 Sandbox 에서 컴파일 하는 명령어로 make와 clang을 이용해왔다.
$ clang prac.c
$ make prac.c
컴파일하고자 하는 코드 외에도
컴파일 후 저장하고자 하는 파일명과 같은 추가적인 정보를 함께 줄 수도 있는데
이런 정보들을 명령행 인자(command-line arguments) 라고 부른다.
이전에 사용해본적이 있는 -o 도 명령행 인자의 예시이다.
그저 clang string.c 만 작성하는 경우에는 a.out이라는 파일을 출력하는데
-o 원하는 파일명 을 붙이면 해당 파일명을 가진 파일을 출력한다.
즉, 명령행 인자는 말 그대로 명령어 뒤에 쓰고 프로그램의 입력과 같이 넣어주는 인자이다.
그래서 보통 실행하고자 하는 프로그램 뒤에 적는다.
int main(int argc, string argv[])
앞서 우리는 int main(void){ ... } 를 기본 형식과 같이 계속 작성해왔는데
형태를 보면 main도 하나의 함수임을 알 수 있다.
이제는 main() 안에 void를 대신하여 int argc, string argv[] 라고 적는 경우를 알아보자.
#include <stdio.h>
int main(int argc, string argv[]){
/* ... */
}
argc는 main 함수가 받게 될 입력의 개수이고
argv[]는 그 입력이 포함되어 있는 배열이다.
쉽게 표현하자면 argv.length 가 argc인 것.
프로그램을 명령행에서 실행하기 때문에 입력은 문자열로 주어진다.
때문에 argc는 int, argv는 string 배열이다.
argv[0]은 기본적으로 프로그램의 이름으로 저장된다.
만일 하나의 입력이 더 주어지면 argv[1] 에 저장될 것이다.
위 내용이 무슨 말인가 싶으니 예시를 통해서 알아보자.
예시의 코드는 prac.c 에 저장되어 있다.
#include <stdio.h>
#include <cs50.h>
int main(int argc, string argv[]){
if(argc == 2){
printf("hello, %s\n", argv[1]);
} else {
printf("hello, world\n");
}
}
make prac 를 이용해 위 코드를 컴파일한 후 ./prac 로 실행해보면 hello, world 가 출력된다.
명령행 인자에 주어진 값이 프로그램 이름 하나밖에 없기 때문이다. (argc = 1, argv[0] = "prac")
하지만 만일 ./prac ryung 로 실행해보면
명령행 인자에 ryung이라는 값이 추가로 입력되어 argc = 2, argv[0] = "prac", argv[1] = "ryung" 이 된다.
그리고 콘솔창에는 hello, ryung 이 출력됨을 볼 수 있다.
+)
명령행 인자의 예시는 c에서 뿐만 아니라 비교적 친숙한 git에서도 볼 수 있다.
git을 cli로 다룰 때 git branch, git checkout 과 같은 명령어들을 입력하는데
이는 git이라는 프로그램에 명령행 인자로 branch, checkout 을 받은 것과 같다.
원래 branch, checkout 등의 프로그램을 따로 만들었어야 할 것을
명령행 인자를 이용하여 하나의 프로그램(git)으로 확장성있게 사용한 것이라고 이해할 수 있다.
정리하자면 명령행 인자는
프로그램 자체의 환경변수를 제어하고 설정하기에 유용하다는 장점을 가졌다로 정리할 수 있다.
복습 퀴즈
Q1. 아래와 같은 main 함수를 지니는 edwith.c 소스코드를 작성하고 컴파일했다.
'$ ./edwidth hello world' 를 실행했을 때 argc의 값은?
int main(int argc, string argv[]){
...
}
답: 3
argc는 main 함수가 받게 될 입력의 개수이며, 소스코드가 담긴 파일명 1개를 기본값으로 가진 뒤 명령행 인자에서 파일명 다음에 입력된 내용의 개수만큼 증가한다. argv[] 는 그 입력을 담은 배열이다.예시의 경우 argv = [edwidth, hello, world] 이 되고, argc 는 argv의 크기인 3 이 된다.
'CS > CS50' 카테고리의 다른 글
[CS][CS50] 알고리즘 - 버블 정렬 / 선택 정렬 (0) | 2023.06.17 |
---|---|
[CS][CS50] 알고리즘 - 검색 알고리즘 / 알고리즘 표기법 / 선형 검색 (0) | 2023.06.10 |
[CS][CS50] 배열 - 문자열과 배열 / 문자열의 활용 (0) | 2023.06.08 |
[CS][CS50] 배열 - 배열 (0) | 2023.05.29 |
[CS][CS50] 배열 - 컴파일링 / 디버깅 / 코드의 디자인 (0) | 2023.05.26 |