C에서 명령줄 인수

안녕하세요, 열정적인 프로그래머 되고자 하는 여러분! 오늘 우리는 C에서 명령줄 인수에 대한 흥미로운 여정을 시작할 것입니다. 여러분의 친절한 이웃 컴퓨터 선생님이자 저는 이 주제를 단계별로 안내해 드리겠습니다. 그러니 마음에 드는 음료를 한 잔 들고, 편안하게 자리를 잡고, 이제 시작해 보겠습니다!

C - Command Line Arguments

명령줄 인수는 무엇인가요?

상상해 보세요, 여러분이 식당에 앉아 웨이터에게 무엇을 먹고 싶다고 말하는 场景. 이와 같은 방식으로, 명령줄 인수는 우리의 프로그램을 시작할 때 프로그램에 주는 지시입니다. 프로그램이 시작되자마자 입력이나 옵션을 제공하는 방법입니다.

기본 개념

C에서는 main() 함수의 두 가지 특별한 매개변수를 통해 명령줄 인수에 접근할 수 있습니다:

  1. argc (인수 개수): 이는 제공된 인수의 개수를 알려줍니다.
  2. argv (인수 벡터): 이는 실제 인수를 포함하는 문자열 배열입니다.

간단한 예제를 보겠습니다:

#include <stdio.h>

int main(int argc, char *argv[]) {
printf("인수의 개수: %d\n", argc);

for (int i = 0; i < argc; i++) {
printf("인수 %d: %s\n", i, argv[i]);
}

return 0;
}

이 프로그램을 컴파일하고 다음과 같이 실행하면:

./program hello world

출력은 다음과 같습니다:

인수의 개수: 3
인수 0: ./program
인수 1: hello
인수 2: world

이를 분해해 보겠습니다:

  • argc는 3입니다. 왜냐하면 우리에게 세 개의 인수가 있기 때문입니다.
  • argv[0]은 항상 프로그램 자신의 이름입니다.
  • argv[1]argv[2]은 우리가 제공한 인수입니다.

명령줄 인수를 사용하는 이유

명령줄 인수는 우리의 프로그램을 더 유연하게 만드는 데 매우 유용합니다. 프로그램의 동작을 변경하기 위해 코드를 수정하고 다시 컴파일할 필요 없이, 프로그램이 시작될 때 입력을 제공할 수 있습니다. Καфе에서 커피 주문을 커스터마이징하는 것과 같이, 매번 어떻게 원하는지 결정할 수 있습니다!

명령줄에서 숫자 인수 전달

이제 한 단계 더 나아가 보겠습니다. 우리가 프로그램에 숫자를 전달하고 싶다면 어떻게 할까요? 명령줄 인수는 모두 문자열로 오지만, 우리가 계산에 사용하기 위해서는 숫자로 변환해야 합니다.

두 개의 숫자를 더하는 예제를 보겠습니다:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
if (argc != 3) {
printf("정확히 두 개의 숫자를 제공해 주세요.\n");
return 1;
}

int num1 = atoi(argv[1]);
int num2 = atoi(argv[2]);

int sum = num1 + num2;

printf("%d와 %d의 합은 %d입니다.\n", num1, num2, sum);

return 0;
}

이 프로그램을 다음과 같이 실행하면:

./add_numbers 5 7

출력은 다음과 같습니다:

5와 7의 합은 12입니다.

이 코드에서는 다음이 일어납니다:

  1. 인수의 개수가 정확히 3인지 확인합니다 (프로그램 이름 + 두 개의 숫자).
  2. atoi() (ASCII to Integer)를 사용하여 문자열 인수를 정수로 변환합니다.
  3. 덧셈을 수행하고 결과를 출력합니다.

주의사항

언제나 입력을 검증하세요! 위의 예제에서, 누군가가 비수학적 인수로 프로그램을 실행하려고 시도하면, 그 프로그램은 부드럽게 처리되지 않습니다. 실제 애플리케이션에서는 더 robust한 오류 검사를 추가하고 싶을 것입니다.

명령줄 인수의 실용적인 사용 사례

명령줄 인수가 빛나는 실용적인 场景을 탐구해 보겠습니다:

1. 파일 연산

파일을 읽고 단어 수를 계산하는 프로그램을 상상해 보세요:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
if (argc != 2) {
printf("사용법: %s < 파일이름 >\n", argv[0]);
return 1;
}

FILE *file = fopen(argv[1], "r");
if (file == NULL) {
printf("파일 %s를 열 수 없습니다.\n", argv[1]);
return 1;
}

int word_count = 0;
char word[100];

while (fscanf(file, "%s", word) != EOF) {
word_count++;
}

fclose(file);

printf("파일 %s에는 %d개의 단어가 포함되어 있습니다.\n", argv[1], word_count);

return 0;
}

이 프로그램을 다음과 같이 실행합니다:

./word_counter myfile.txt

이 프로그램은 명령줄 인수로 제공된 파일 이름을 사용하여 파일을 열고 처리합니다.

2. 프로그램 모드

명령줄 인수를 사용하여 프로그램의 다른 모드를 설정할 수도 있습니다:

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
if (argc != 2) {
printf("사용법: %s < 모드 >\n", argv[0]);
return 1;
}

if (strcmp(argv[1], "hello") == 0) {
printf("Hello, World!\n");
} else if (strcmp(argv[1], "goodbye") == 0) {
printf("Goodbye, World!\n");
} else {
printf("알 수 없는 모드: %s\n", argv[1]);
}

return 0;
}

이 프로그램을 다음과 같이 실행할 수 있습니다:

./greeter hello

또는

./greeter goodbye

이 프로그램은 제공된 인수에 따라 동작을 변경합니다.

일반 명령줄 인수 패턴

다음은 명령줄 인수에서 자주 볼 수 있는 패턴입니다:

패턴 예제 설명
단일 대시 -a 일반적으로 단문자 옵션에 사용됩니다
이중 대시 --all 일반적으로 전체 단어 옵션에 사용됩니다
등호 기호 --file=test.txt 옵션에 값이 필요한 경우에 사용됩니다
공백으로 구분 --file test.txt 옵션에 값을 제공하는 또 다른 방법

이러한 것들은 관례이지 강제 사항은 아닙니다. 다양한 프로그램은 다양한 스타일을 사용할 수 있지만, 프로그램 내에서 일관성을 유지하는 것이 중요합니다!

결론

명령줄 인수는 프로그래머의 도구箱에서 강력한 도구입니다. 그들은 프로그램이 다양한 입력과 场景에 적응할 수 있도록 만들어줍니다. 코드를 수정하고 다시 컴파일할 필요 없이 동작을 변경할 수 있습니다.

프로그래밍 여정을 계속하면서, 명령줄 인수가 더 쉽고 프로그램을 더 다양하게 만들 수 있는 많은 场景을 만날 것입니다. 이를 습득하는 열쇠는 연습입니다. 다양한 방법으로 명령줄 인수를 프로그램에 사용해 보세요.

그리고 항상 기억하세요: 프로그래밍은 소통의 문제입니다. 명령줄 인수는 프로그램이 세상과 소통하는 또 다른 방법입니다. 행복한 코딩, 미래의 기술 마법사 여러분!

Credits: Image by storyset