강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

새싹비빔밥님의 프로필 이미지
새싹비빔밥

작성한 질문수

홍정모의 따라하며 배우는 C언어

13.2 텍스트 파일 입출력 예제

13.2 명령줄 인수 관련 코드 if(argc !=2)의 의미에 관하여

해결된 질문

작성

·

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입니다.

argc와 argv

말씀하신 코드 부분

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와 비교하는지 헷갈리실 수도 있습니다.


argc와 argv의 값에 대하여

본 강의 영상에서는 비주얼 스튜디오 내에서 설정을 이용하여 명령줄 인수를 입력해주지만, 일반적인 유닉스 기반 환경에서는 프로그래머가 쉘에서 프로그램 실행 시 입력해주게됩니다. 가령 프로그램의 이름이 app이고 명령줄 인자로 넣어주는 텍스트 파일의 이름이 input.txt라면, 아래와 같이 실행합니다.

app input.txt

주의해야 할 점은, argcargv 모두 프로그램 이름을 포함한다는 것입니다. 위 예시에서 argc는 2가 되며, argv[0]"app", argv[1]"input.txt"가 됩니다.그래서 if (argc != 2)는 정확하게 '프로그램 이름을 제외하고 추가로 하나의 인자가 들어왔는지' 검사하는 것이 됩니다.

11.10 명령줄 인수 영상에서 간단히 이에 대해서 다루니, 다시 보셔도 될 것 같습니다.


if문 내부의 동작

만약 본 프로그램의 사용자가 인자의 개수를 잘못 지정하여 전달한 경우, 프로그램이 사용자에게 올바른 사용 방식을 알려주는 과정이 필요할 수 있습니다. 강의 코드에서 printf문으로 출력하는 내용이 그것입니다.

printf("Usage: %s filename\n",argv[0]);
exit(EXIT_FAILURE);

argv[0]은 말씀드렸듯이 프로그램의 이름을 의미하기 때문에, 위 printf 함수는 '프로그램 이름 뒤에 filename(전달할 파일 이름)을 붙여서 실행해주세요'라고 사용자에게 알려주는 안내문 역할을 합니다.

그리고 마지막으로는 exit(EXIT_FAILURE)로 에러 코드를 내보내면서 프로그램을 종료하게 됩니다.


왜 argc < 2가 아닌가?

해당 부분은 의미 자체가 '인자로 사용할 텍스트 파일이 주어지지 않은 경우'를 걸러내기 위한 것이었기 때문에, 정확히 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개의 인수가 있어야 한다는 것을 의미합니다.

  1. argc != 2인 이유: 프로그램에서는 일반적으로 프로그램의 이름이 첫 번째 인수(argv[0])로 자동으로 들어가기 때문에 유효한 입력 인수의 개수가 1일 때(argc == 2) 프로그램이 정상적으로 동작하길 기대합니다. 따라서 argc가 2가 아닌 경우(즉, 필요한 두 개의 인수가 주어지지 않은 경우) 잘못된 사용법임을 알리고 종료합니다.

  2. argc < 2가 아닌 이유: 실제로 argc < 2로 작성해도 논리적으로는 동작할 것입니다. 그러나 argc != 2는 정확히 특정한 값인 2가 되어야 함을 명시적으로 보여줍니다. 이는 코드를 읽는 사람에게 사용법을 더 명확하게 전달할 수 있습니다.

아래는 유사한 질문이 답변된 게시물입니다. 도움이 되실 수 있을 것 같습니다:
- [13.2 강] if(argc != 2) 의 의미에 관해서

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

새싹비빔밥님의 프로필 이미지
새싹비빔밥

작성한 질문수

질문하기