C 언어 명령줄 인수 파싱 (Command-Line Argument Parsing) 방법

CBeginner
지금 연습하기

소개

이 랩에서는 C 프로그래밍에서 명령줄 인수를 파싱하는 방법을 배우게 됩니다. 이 랩은 인수의 개수에 접근하고, 인수 값을 검색하며, 잘못된 인수를 처리하고, 간단한 명령줄 도구를 구현하는 것을 포함하여 명령줄 인수의 기본 개념을 다룹니다. 랩을 마치면 C 프로그램에서 명령줄 인수를 사용하는 방법에 대한 확실한 이해를 갖게 될 것입니다.

명령줄 인수 이해

이 단계에서는 C 프로그래밍에서 명령줄 인수의 기본 개념과 프로그램 실행 시 명령줄 인수가 어떻게 전달되는지 배우게 됩니다.

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

명령줄 인수는 명령줄에서 프로그램을 실행할 때 프로그램에 전달되는 매개변수입니다. C 에서 이러한 인수는 main() 함수가 두 개의 특수한 매개변수, 즉 argcargv를 통해 받습니다.

  1. ~/project 디렉토리에 arguments_intro.c라는 새 파일을 생성합니다.
cd ~/project
touch arguments_intro.c
  1. 명령줄 인수를 탐색하기 위해 다음 코드를 추가합니다.
#include <stdio.h>

int main(int argc, char* argv[]) {
    printf("Number of arguments: %d\n", argc);

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

    return 0;
}
  1. 프로그램을 컴파일합니다.
gcc arguments_intro.c -o arguments_intro
  1. 다양한 수의 인수로 프로그램을 실행합니다.
./arguments_intro
./arguments_intro Hello
./arguments_intro Hello World

예시 출력:

## 인수가 제공되지 않은 경우
Number of arguments: 1
Argument 0: ./arguments_intro

## 인수가 하나인 경우
Number of arguments: 2
Argument 0: ./arguments_intro
Argument 1: Hello

## 인수가 두 개인 경우
Number of arguments: 3
Argument 0: ./arguments_intro
Argument 1: Hello
Argument 2: World

argcargv 이해하기

  • argc (인수 개수, argument count): 프로그램 이름 자체를 포함하여 프로그램에 전달된 총 인수 수를 나타냅니다.
  • argv (인수 벡터, argument vector): 실제 인수를 포함하는 문자열 배열입니다.
  • argv[0]은 항상 프로그램의 이름입니다.
  • 후속 인수는 argv[1]부터 시작합니다.

인수 개수 접근

이 단계에서는 argc 매개변수를 사용하여 C 프로그램에 전달된 인수의 개수에 접근하고 활용하는 방법을 배우게 됩니다.

인수의 개수 확인하기

인수의 개수를 확인하는 방법을 이해하는 것은 유연하고 강력한 명령줄 프로그램을 만드는 데 매우 중요합니다. 인수의 개수를 검증하고 적절한 피드백을 제공하는 방법을 배우게 됩니다.

  1. ~/project 디렉토리에 argument_count.c라는 새 파일을 생성합니다.
cd ~/project
touch argument_count.c
  1. 인수 개수 확인을 보여주기 위해 다음 코드를 추가합니다.
#include <stdio.h>

int main(int argc, char* argv[]) {
    // Check if the correct number of arguments is provided
    if (argc < 2) {
        printf("Error: At least one argument is required.\n");
        printf("Usage: %s <argument1> [argument2] ...\n", argv[0]);
        return 1;
    }

    // Print the total number of arguments
    printf("Total number of arguments: %d\n", argc);

    // Check for a maximum number of arguments
    if (argc > 4) {
        printf("Warning: Too many arguments. Only first 3 will be processed.\n");
    }

    return 0;
}
  1. 프로그램을 컴파일합니다.
gcc argument_count.c -o argument_count
  1. 다양한 수의 인수로 프로그램을 실행합니다.
## No arguments
./argument_count

## One argument
./argument_count Hello

## Multiple arguments
./argument_count Hello World Lab

## Too many arguments
./argument_count Arg1 Arg2 Arg3 Arg4 Arg5

예시 출력:

## No arguments
Error: At least one argument is required.
Usage: ./argument_count <argument1> [argument2] ...

## One argument
Total number of arguments: 2

## Multiple arguments
Total number of arguments: 4

## Too many arguments
Total number of arguments: 6
Warning: Too many arguments. Only first 3 will be processed.

핵심 개념

  • argc는 프로그램 이름을 포함하여 총 인수 수를 알려줍니다.
  • argc를 사용하여 인수의 개수를 검증할 수 있습니다.
  • 잘못된 인수가 제공될 경우 명확한 사용 지침을 제공합니다.
  • 너무 적거나 너무 많은 인수가 있는 경우를 적절하게 처리합니다.

인수 값 가져오기

이 단계에서는 C 프로그램에서 argv 배열을 사용하여 개별 인수 값을 검색하고 처리하는 방법을 배우게 됩니다.

인수 접근 및 처리

특정 인수 값에 접근하는 방법을 이해하는 것은 사용자 입력을 효과적으로 처리할 수 있는 대화형 명령줄 도구를 만드는 데 필수적입니다.

  1. ~/project 디렉토리에 argument_values.c라는 새 파일을 생성합니다.
cd ~/project
touch argument_values.c
  1. 인수 값 검색을 보여주기 위해 다음 코드를 추가합니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char* argv[]) {
    // Check if at least two arguments are provided
    if (argc < 3) {
        printf("Usage: %s <name> <age>\n", argv[0]);
        return 1;
    }

    // Retrieve and store argument values
    char* name = argv[1];
    int age = atoi(argv[2]);

    // Validate age
    if (age <= 0) {
        printf("Error: Age must be a positive number.\n");
        return 1;
    }

    // Process and display argument values
    printf("Name: %s\n", name);
    printf("Age: %d\n", age);

    // Demonstrate string comparison
    if (strcmp(name, "LabEx") == 0) {
        printf("Welcome, LabEx user!\n");
    }

    return 0;
}
  1. 프로그램을 컴파일합니다.
gcc argument_values.c -o argument_values
  1. 다양한 인수로 프로그램을 실행합니다.
## Correct usage
./argument_values LabEx 25

## Incorrect usage
./argument_values
./argument_values John
./argument_values John -5

예시 출력:

## Correct usage
Name: LabEx
Age: 25
Welcome, LabEx user!

## Incorrect usage (no arguments)
Usage: ./argument_values <name> <age>

## Incorrect usage (missing age)
Usage: ./argument_values <name> <age>

## Incorrect usage (invalid age)
Name: John
Error: Age must be a positive number.

핵심 개념

  • argv[1], argv[2] 등은 특정 인수 값에 접근합니다.
  • atoi()는 문자열 인수를 정수로 변환합니다.
  • strcmp()는 문자열을 비교합니다.
  • 항상 입력 인수를 검증하고 정리합니다.

잘못된 인수 처리

이 단계에서는 다양한 유형의 잘못된 입력 시나리오를 관리하기 위해 C 프로그램에서 강력한 인수 유효성 검사 및 오류 처리를 구현하는 방법을 배우게 됩니다.

포괄적인 인수 유효성 검사

신뢰할 수 있는 명령줄 도구를 만들려면 예기치 않은 동작을 방지하고 명확한 오류 메시지를 제공하기 위해 사용자가 제공한 인수를 신중하게 검증해야 합니다.

  1. ~/project 디렉토리에 argument_validation.c라는 새 파일을 생성합니다.
cd ~/project
touch argument_validation.c
  1. 포괄적인 인수 유효성 검사를 보여주기 위해 다음 코드를 추가합니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

// Function to check if a string is a valid number
int is_numeric(const char* str) {
    while (*str) {
        if (!isdigit(*str)) {
            return 0;
        }
        str++;
    }
    return 1;
}

int main(int argc, char* argv[]) {
    // Check for correct number of arguments
    if (argc != 3) {
        fprintf(stderr, "Usage: %s <username> <age>\n", argv[0]);
        fprintf(stderr, "Error: Exactly 2 arguments required.\n");
        return 1;
    }

    // Validate username
    char* username = argv[1];
    if (strlen(username) < 3 || strlen(username) > 20) {
        fprintf(stderr, "Error: Username must be between 3 and 20 characters.\n");
        return 1;
    }

    // Validate age
    char* age_str = argv[2];
    if (!is_numeric(age_str)) {
        fprintf(stderr, "Error: Age must be a positive number.\n");
        return 1;
    }

    int age = atoi(age_str);
    if (age < 0 || age > 120) {
        fprintf(stderr, "Error: Age must be between 0 and 120.\n");
        return 1;
    }

    // Process valid arguments
    printf("Username validated: %s\n", username);
    printf("Age validated: %d\n", age);

    return 0;
}
  1. 프로그램을 컴파일합니다.
gcc argument_validation.c -o argument_validation
  1. 다양한 입력 시나리오로 프로그램을 실행합니다.
## Correct usage
./argument_validation JohnDoe 30

## Incorrect number of arguments
./argument_validation
./argument_validation JohnDoe

## Invalid username
./argument_validation Jo 30
./argument_validation JohnDoeWithAVeryLongUsername 30

## Invalid age
./argument_validation JohnDoe abc
./argument_validation JohnDoe -5
./argument_validation JohnDoe 150

예시 출력:

## Correct usage
Username validated: JohnDoe
Age validated: 30

## Incorrect number of arguments
Usage: ./argument_validation <username> <age>
Error: Exactly 2 arguments required.

## Invalid username
Error: Username must be between 3 and 20 characters.

## Invalid age formats
Error: Age must be a positive number.
Error: Age must be between 0 and 120.

핵심 개념

  • 사용자 정의 유효성 검사 함수를 사용하여 인수 형식을 확인합니다.
  • 여러 유효성 검사 검사를 구현합니다.
  • 오류 메시지에 stderr를 사용합니다.
  • 명확하고 유익한 오류 피드백을 제공합니다.
  • 잘못된 입력에 대해 0 이 아닌 종료 코드를 반환합니다.

간단한 명령줄 도구 구현

이 단계에서는 명령줄 인수를 구문 분석하고 처리하는 방법에 대해 배운 기술을 보여주는 실용적인 명령줄 도구를 만들 것입니다.

계산기 명령줄 도구

사용자가 제공한 인수를 기반으로 기본적인 산술 연산을 수행하는 간단한 명령줄 계산기를 구현합니다.

  1. ~/project 디렉토리에 calc.c라는 새 파일을 생성합니다.
cd ~/project
touch calc.c
  1. 명령줄 계산기를 생성하기 위해 다음 코드를 추가합니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// Function prototypes
double add(double a, double b);
double subtract(double a, double b);
double multiply(double a, double b);
double divide(double a, double b);

int main(int argc, char* argv[]) {
    // Check for correct number of arguments
    if (argc != 4) {
        fprintf(stderr, "Usage: %s <operation> <num1> <num2>\n", argv[0]);
        fprintf(stderr, "Operations: add, sub, mul, div\n");
        return 1;
    }

    // Parse operation
    char* operation = argv[1];

    // Convert arguments to numbers
    double num1 = atof(argv[2]);
    double num2 = atof(argv[3]);

    // Perform calculation based on operation
    double result = 0;
    if (strcmp(operation, "add") == 0) {
        result = add(num1, num2);
        printf("%.2f + %.2f = %.2f\n", num1, num2, result);
    } else if (strcmp(operation, "sub") == 0) {
        result = subtract(num1, num2);
        printf("%.2f - %.2f = %.2f\n", num1, num2, result);
    } else if (strcmp(operation, "mul") == 0) {
        result = multiply(num1, num2);
        printf("%.2f * %.2f = %.2f\n", num1, num2, result);
    } else if (strcmp(operation, "div") == 0) {
        // Check for division by zero
        if (num2 == 0) {
            fprintf(stderr, "Error: Division by zero\n");
            return 1;
        }
        result = divide(num1, num2);
        printf("%.2f / %.2f = %.2f\n", num1, num2, result);
    } else {
        fprintf(stderr, "Error: Invalid operation\n");
        fprintf(stderr, "Supported operations: add, sub, mul, div\n");
        return 1;
    }

    return 0;
}

// Arithmetic operation functions
double add(double a, double b) {
    return a + b;
}

double subtract(double a, double b) {
    return a - b;
}

double multiply(double a, double b) {
    return a * b;
}

double divide(double a, double b) {
    return a / b;
}
  1. 프로그램을 컴파일합니다.
gcc calc.c -o calc
  1. 다양한 연산으로 계산기를 실행합니다.
## Addition
./calc add 5 3

## Subtraction
./calc sub 10 4

## Multiplication
./calc mul 6 7

## Division
./calc div 15 3

## Error cases
./calc div 10 0
./calc pow 5 2

예시 출력:

## Addition
5.00 + 3.00 = 8.00

## Subtraction
10.00 - 4.00 = 6.00

## Multiplication
6.00 * 7.00 = 42.00

## Division
15.00 / 3.00 = 5.00

## Division by zero
Error: Division by zero

## Invalid operation
Error: Invalid operation
Supported operations: add, sub, mul, div

핵심 개념

  • 인수 구문 분석과 기능적 로직을 결합합니다.
  • 다양한 연산 시나리오를 처리합니다.
  • 명확한 오류 메시지를 제공합니다.
  • 서로 다른 연산에 대해 별도의 함수를 사용합니다.
  • 입력을 검증하고 예외 케이스를 처리합니다.

요약

이 랩에서는 C 프로그래밍에서 명령줄 인수를 구문 분석하는 방법을 배우게 됩니다. 먼저, main() 함수의 argcargv 매개변수를 포함하여 명령줄 인수의 기본 개념을 이해하게 됩니다. 그런 다음 인수의 개수에 접근하고 해당 값을 검색하는 방법을 배우게 됩니다. 또한, 잘못된 인수를 처리하는 방법을 살펴보고 간단한 명령줄 도구를 구현할 것입니다. 이 랩을 마치면 C 프로그램에서 명령줄 인수를 효과적으로 활용할 수 있는 지식과 기술을 갖추게 됩니다.