Разбор аргументов командной строки на языке C

CCBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии (лабораторной работе) вы научитесь разбирать аргументы командной строки на языке программирования C. В рамках практического занятия рассматриваются основные концепции аргументов командной строки, включая получение количества аргументов, извлечение значений аргументов, обработку недопустимых аргументов и реализацию простого инструмента командной строки. По завершении практического занятия вы будете хорошо понимать, как работать с аргументами командной строки в своих программах на языке C.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL c(("C")) -.-> c/BasicsGroup(["Basics"]) c(("C")) -.-> c/ControlFlowGroup(["Control Flow"]) c(("C")) -.-> c/CompoundTypesGroup(["Compound Types"]) c(("C")) -.-> c/FunctionsGroup(["Functions"]) c(("C")) -.-> c/UserInteractionGroup(["User Interaction"]) c/BasicsGroup -.-> c/operators("Operators") c/ControlFlowGroup -.-> c/if_else("If...Else") c/CompoundTypesGroup -.-> c/strings("Strings") c/FunctionsGroup -.-> c/function_parameters("Function Parameters") c/UserInteractionGroup -.-> c/user_input("User Input") c/UserInteractionGroup -.-> c/output("Output") subgraph Lab Skills c/operators -.-> lab-438243{{"Разбор аргументов командной строки на языке C"}} c/if_else -.-> lab-438243{{"Разбор аргументов командной строки на языке C"}} c/strings -.-> lab-438243{{"Разбор аргументов командной строки на языке C"}} c/function_parameters -.-> lab-438243{{"Разбор аргументов командной строки на языке C"}} c/user_input -.-> lab-438243{{"Разбор аргументов командной строки на языке C"}} c/output -.-> lab-438243{{"Разбор аргументов командной строки на языке C"}} end

Понимание аргументов командной строки

На этом этапе вы узнаете основные концепции аргументов командной строки в программировании на языке C и как они передаются программе при ее запуске.

Что такое аргументы командной строки?

Аргументы командной строки - это параметры, которые передаются программе при ее запуске из командной строки. В языке C эти аргументы передаются функции main() с помощью двух специальных параметров: argc и argv.

  1. Создайте новый файл с именем arguments_intro.c в директории ~/project:
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

Пример вывода:

## When no arguments are provided
Number of arguments: 1
Argument 0:./arguments_intro

## With one argument
Number of arguments: 2
Argument 0:./arguments_intro
Argument 1: Hello

## With two arguments
Number of arguments: 3
Argument 0:./arguments_intro
Argument 1: Hello
Argument 2: World

Понимание argc и argv

  • argc (количество аргументов): Представляет общее количество аргументов, переданных программе, включая само имя программы.
  • argv (массив аргументов): Массив строк, содержащий фактические аргументы.
  • argv[0] всегда является именем программы.
  • Последующие аргументы начинаются с argv[1].

Получение количества аргументов

На этом этапе вы узнаете, как получить и использовать количество аргументов, переданных программе на языке C, с помощью параметра argc.

Проверка количества аргументов

Понимание того, как проверить количество аргументов, является важной частью создания гибких и надежных программ командной строки. Вы научитесь проверять количество аргументов и давать соответствующую обратную связь.

  1. Создайте новый файл с именем argument_count.c в директории ~/project:
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 для проверки количества аргументов.
  • Давайте четкие инструкции по использованию, если переданы неверные аргументы.
  • Корректно обрабатывайте случаи с недостаточным или избыточным количеством аргументов.

Извлечение значений аргументов

На этом этапе вы узнаете, как извлекать и обрабатывать отдельные значения аргументов с использованием массива argv в программе на языке C.

Получение и обработка аргументов

Понимание того, как получить конкретные значения аргументов, является важным для создания интерактивных инструментов командной строки, которые могут эффективно обрабатывать пользовательский ввод.

  1. Создайте новый файл с именем argument_values.c в директории ~/project:
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. Создайте новый файл с именем argument_validation.c в директории ~/project:
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 для вывода сообщений об ошибках.
  • Предоставляйте четкую и информативную обратную связь об ошибках.
  • Возвращайте ненулевые коды выхода для недопустимого ввода.

Реализация простого инструмента командной строки

На этом этапе вы создадите практический инструмент командной строки, который демонстрирует навыки, полученные вами при разборе и обработке аргументов командной строки.

Инструмент командной строки - калькулятор

Вы реализуете простой калькулятор командной строки, который выполняет базовые арифметические операции на основе аргументов, предоставленных пользователем.

  1. Создайте новый файл с именем calc.c в директории ~/project:
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. Сначала вы познакомитесь с основными концепциями аргументов командной строки, включая параметры argc и argv в функции main(). Затем вы научитесь получать количество аргументов и извлекать их значения. Кроме того, вы изучите обработку недопустимых аргументов и реализуете простой инструмент командной строки. К концу этого практического занятия у вас будут знания и навыки для эффективного использования аргументов командной строки в своих программах на языке C.