[CS50] 배열: 명령행 인자
❄️ David Malan 교수의 모두를 위한 컴퓨터 과학(CS50 2019)을 바탕으로 정리한 내용입니다.
우리가 여태껏 많이 사용해온 main 함수를 보다 자세히 들여다볼 때가 왔습니다.
main도 그 형태를 보면 하나의 함수임을 알 수 있는데요, 이젠 더이상 main() 안에 기계적으로 void 라고 입력하는 대신 아래 코드와 같이 argc, argv 를 정의해보겠습니다.
#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");
}
}
여기서 첫번째 변수 argc는 main 함수가 받게 될 입력의 개수입니다.
그리고 argv[]
는 그 입력이 포함되어 있는 배열입니다.
프로그램을 명령행에서 실행하므로, 입력은 문자열로 주어집니다.
따라서 argv[]
는 string 배열이 됩니다.
argv[0]
는 기본적으로 프로그램의 이름으로 저장됩니다.
만약 하나의 입력이 더 주어진다면 argv[1]
에 저장될 것입니다.
따라서 하나의 명령행 인자를 입력받은 뒤 출력하고 싶다면,
argc == 2
인지 체크한 뒤, argv[1]
을 출력해야 합니다.
예를 들어 위 프로그램을 “arg.c”라는 이름으로 저장하고 컴파일 한 후 “./argc”로 실행해보면 “hello, world”라는 값이 출력됩니다.
명령행 인자에 주어진 값이 프로그램 이름 하나밖에 없기 때문입니다.
하지만 “./argc David”로 실행해보면 “hello, David”라는 값이 출력됩니다.
명령행 인자에 David
라는 값이 추가로 입력되었고, 따라서 argc
는 2, argv[1]
은 “David”가 되기 때문입니다.
생각해보기
명령행 인자는 프로그램의 확장성에 어떤 도움이 될까요? 구체적인 예시를 떠올려보세요.
- 프로그램의 실행 후 내부적인 코드를 사용하지 않고 데이터를 입력받을 수 있습니다.
- 프로그램 실행 시 옵션값을 함께 넣어주어 실행 환경을 바꿀 수 있습니다.
$rm file1 file2
: 명령행 인자로file1
과file2
를 전달해 두 파일을 제거할 수 있습니다.$rm -r -f directory
: 명령행 인자로-r
,-f
옵션을 넣어주어 directory 폴더, 하위 폴더 및 모든 파일을 제거하고 확인 프롬트를 표시하지 않을 수 있습니다.
💛 개인 공부 기록용 블로그입니다. 👻