해결된 질문
작성
·
115
1
안녕하세요. 13.2강 강의내용의 코드 중
...
if (argc != 2)
{
printf("Usage: %s filename\n",argv[0]);
exit(EXIT_FAILURE);
}
이 있는데,
해당 코드가 정확히 어떤 오류를 방지하기 위한 코드인지 이해가 잘 가지 않고,
argc는 인수의 개수와 관련있는 값으로 알고 있는데 왜 argc<2가 아니라 argc!=2로 한건지 궁금합니다.
감사합니다.
답변 2
1
안녕하세요? 질문&답변 도우미 durams입니다.
말씀하신 코드 부분
if (argc != 2) {
printf("Usage: %s filename\n", argv[0]);
exit(EXIT_FAILURE);
}
에서 argc
는 프로그램 실행 시 전달된 command line argument(명령줄 인수)의 개수를 의미합니다. 그리고 위 코드에서 나오지는 않지만, argv
는 주어진 각 인자 문자열을 가리키는 포인터입니다.(그래서 main
의 선언부를 보시면 char *argv[]
와 같이 포인터의 배열로 되어있죠)
argc
가 2가 아니라는 것은 명령줄 인수로 전달된 인자의 개수가 2개가 아니라는 뜻이 됩니다. 여기서, 넣어줘야 하는 파일 이름 자체는 1개인데 왜 2와 비교하는지 헷갈리실 수도 있습니다.
본 강의 영상에서는 비주얼 스튜디오 내에서 설정을 이용하여 명령줄 인수를 입력해주지만, 일반적인 유닉스 기반 환경에서는 프로그래머가 쉘에서 프로그램 실행 시 입력해주게됩니다. 가령 프로그램의 이름이 app
이고 명령줄 인자로 넣어주는 텍스트 파일의 이름이 input.txt
라면, 아래와 같이 실행합니다.
app input.txt
주의해야 할 점은, argc
와 argv
모두 프로그램 이름을 포함한다는 것입니다. 위 예시에서 argc
는 2가 되며, argv[0]
은 "app"
, argv[1]
은 "input.txt"
가 됩니다.그래서 if (argc != 2)
는 정확하게 '프로그램 이름을 제외하고 추가로 하나의 인자가 들어왔는지' 검사하는 것이 됩니다.
11.10 명령줄 인수 영상에서 간단히 이에 대해서 다루니, 다시 보셔도 될 것 같습니다.
만약 본 프로그램의 사용자가 인자의 개수를 잘못 지정하여 전달한 경우, 프로그램이 사용자에게 올바른 사용 방식을 알려주는 과정이 필요할 수 있습니다. 강의 코드에서 printf
문으로 출력하는 내용이 그것입니다.
printf("Usage: %s filename\n",argv[0]);
exit(EXIT_FAILURE);
argv[0]
은 말씀드렸듯이 프로그램의 이름을 의미하기 때문에, 위 printf
함수는 '프로그램 이름 뒤에 filename(전달할 파일 이름)을 붙여서 실행해주세요'라고 사용자에게 알려주는 안내문 역할을 합니다.
그리고 마지막으로는 exit(EXIT_FAILURE)
로 에러 코드를 내보내면서 프로그램을 종료하게 됩니다.
해당 부분은 의미 자체가 '인자로 사용할 텍스트 파일이 주어지지 않은 경우'를 걸러내기 위한 것이었기 때문에, 정확히 argc != 2
로 명시해 주는 것이 의미상 더 적합하다고 볼 수 있습니다.
또 다른 이유로, 어떤 사용자가 본 프로그램 실행 시 제멋대로 텍스트 파일을 두 개나 전달하려 한다고 생각해볼게요. 그러면 argc
의 값은 3이 되겠지만, argc < 2
로는 잡아낼 수 없습니다. 그대로 다음 코드로 진행이 되고, 어디선가 에러가 발생하게 되겠죠.
이 부분은 참고로만 봐주세요.
본 강의에서는 argv[0]
를 출력했을 때 프로그램에 대한 절대 경로(full path)가 나왔습니다. 언제나 이런 것은 아니며, 단순히 프로그램을 실행한 이름일수도 있으며, 상대 경로일 수도 있습니다. 이는 해당 프로그램을 어떤 환경에서 실행했는지, 어떻게 실행했는지에 따라 달라질 수 있습니다.
프로그램 실행 시 언제나 프로그램 이름으로 시작하니 argc
는 무조건 1 이상이라고 생각할 수도 있지만, 이는 보장되지 않습니다. 현재 프로세스에 새롭게 프로그램을 로드하는 함수인 execve
는 명령줄 인자 목록을 전달받습니다. 만약 정상적인 목록 대신 NULL
을 전달한다면 어떻게 될까요? argc
는 0이 될 수 있고, 프로그램에서 이를 검사하지 않는다면 정상적인 동작이 일어나지 않겠죠.
더 궁금하신 점 있으시다면 질문해주세요.
argc
의 값이 많이 헷갈리실 수도 있는데, 본디 C언어 자체가 유닉스 커널을 설계하기 위한 목적이었기 때문에 이러한 몇몇 개념들은 위 글에서 말씀드린 것처럼 유닉스/리눅스 기준으로 봤을 때 훨씬 이해하기 쉬운 경우가 있습니다.
1
안녕하세요, 인프런 AI 인턴입니다. 새싹비빔밥님.
명령줄 인수에서 argc
는 명령줄로 입력된 인수의 개수를 나타냅니다. argv
는 입력된 인수 자체를 문자열로 저장하고 있는 배열입니다.
해당 코드는 명령줄 인수가 2개가 아닌 경우에 오류 메시지를 출력하고 프로그램을 종료시키기 위한 것입니다. 여기서 2개라는 것은 프로그램 이름과 파일 이름, 즉 총 2개의 인수가 있어야 한다는 것을 의미합니다.
argc != 2
인 이유: 프로그램에서는 일반적으로 프로그램의 이름이 첫 번째 인수(argv[0]
)로 자동으로 들어가기 때문에 유효한 입력 인수의 개수가 1일 때(argc == 2
) 프로그램이 정상적으로 동작하길 기대합니다. 따라서 argc
가 2가 아닌 경우(즉, 필요한 두 개의 인수가 주어지지 않은 경우) 잘못된 사용법임을 알리고 종료합니다.
argc < 2
가 아닌 이유: 실제로 argc < 2
로 작성해도 논리적으로는 동작할 것입니다. 그러나 argc != 2
는 정확히 특정한 값인 2가 되어야 함을 명시적으로 보여줍니다. 이는 코드를 읽는 사람에게 사용법을 더 명확하게 전달할 수 있습니다.
아래는 유사한 질문이 답변된 게시물입니다. 도움이 되실 수 있을 것 같습니다:
- [13.2 강] if(argc != 2) 의 의미에 관해서
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
미친 정성.... 꼼꼼한 설명 감사합니다!