0Pricing
C Academy · Урок

Создание инструмента CLI

Практический пример

«Создание инструмента CLI» — бесплатный урок C Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C Academy содержит 4 уроков всего.

Собираем всё вместе

Теперь объединим аргументы, опции и разбор в небольшой, но полноценный инструмент CLI.

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

#include <stdio.h>

int main(int argc, char *argv[]) {
    if (argc < 2) {
        printf("Usage: %s <number>\n", argv[0]);
        return 1;
    }
    printf("You passed: %s\n", argv[1]);
    return 0;
}

Проектирование интерфейса

Хорошие инструменты CLI заранее определяют свой интерфейс. Наш инструмент будет принимать:

  • -v — подробный вывод
  • -r N — повторить вывод N раз
  • один позиционный аргумент: текст для вывода
#include <stdio.h>

int main(void) {
    printf("Interface: prog [-v] [-r N] <text>\n");
    return 0;
}

Объявление параметров

Храните каждое настраиваемое поведение в переменной с разумным значением по умолчанию. Это позволяет отделить разбор от фактической работы.

#include <stdio.h>

int main(void) {
    int verbose = 0;
    int repeat = 1;
    const char *text = NULL;
    printf("defaults: verbose=%d repeat=%d\n", verbose, repeat);
    return 0;
}

Разбор с помощью getopt

Используйте getopt, чтобы заполнить флаги. -r принимает значение, поэтому соответствующая запись в строке опций — r:.

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

int main(int argc, char *argv[]) {
    int verbose = 0, repeat = 1, opt;
    while ((opt = getopt(argc, argv, "vr:")) != -1) {
        if (opt == 'v') verbose = 1;
        else if (opt == 'r') repeat = atoi(optarg);
    }
    printf("verbose=%d repeat=%d\n", verbose, repeat);
    return 0;
}

Чтение позиционного аргумента

После getopt optind указывает на первый аргумент, не являющийся опцией. Получите оттуда текст.

Если аргумент отсутствует, выведите сведения об использовании и завершите работу с кодом ошибки.

#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
    while (getopt(argc, argv, "vr:") != -1) { }
    if (optind >= argc) {
        printf("Error: missing text argument\n");
        return 1;
    }
    printf("text = %s\n", argv[optind]);
    return 0;
}

Проверка числового ввода

Надёжный инструмент проверяет, что для -r получено разумное число. Отклоняйте нулевое или отрицательное количество повторов.

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

int main(int argc, char *argv[]) {
    int repeat = 1, opt;
    while ((opt = getopt(argc, argv, "r:")) != -1) {
        if (opt == 'r') repeat = atoi(optarg);
    }
    if (repeat < 1) {
        printf("Error: repeat must be >= 1\n");
        return 1;
    }
    printf("repeat = %d\n", repeat);
    return 0;
}

Выполнение работы

После разбора и проверки параметров выполните фактическую задачу. Здесь текст выводится repeat раз.

#include <stdio.h>

int main(void) {
    const char *text = "hello";
    int repeat = 3;
    for (int i = 0; i < repeat; i++) {
        printf("%s\n", text);
    }
    return 0;
}

Подробный вывод

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

#include <stdio.h>

int main(void) {
    int verbose = 1;
    const char *text = "hi";
    if (verbose) printf("[debug] about to print text\n");
    printf("%s\n", text);
    return 0;
}

Полный инструмент

Ниже приведена полная программа, объединяющая все части: разбор, проверку и выполнение.

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

int main(int argc, char *argv[]) {
    int verbose = 0, repeat = 1, opt;
    while ((opt = getopt(argc, argv, "vr:")) != -1) {
        if (opt == 'v') verbose = 1;
        else if (opt == 'r') repeat = atoi(optarg);
    }
    if (optind >= argc) { printf("Usage: prog [-v] [-r N] <text>\n"); return 1; }
    const char *text = argv[optind];
    if (verbose) printf("[debug] repeat=%d\n", repeat);
    for (int i = 0; i < repeat; i++) printf("%s\n", text);
    return 0;
}

Коды завершения важны

Инструменты CLI сообщают об успешном выполнении через код завершения. При успехе возвращайте 0, а при ошибках — ненулевое значение.

Скрипты и другие программы используют это, чтобы решить, что делать дальше.

#include <stdio.h>

int main(int argc, char *argv[]) {
    if (argc < 2) {
        printf("failure\n");
        return 2;
    }
    printf("success\n");
    return 0;
}

Запись ошибок в stderr

По соглашению обычный вывод направляется в stdout, а ошибки — в stderr с помощью fprintf(stderr, ...).

Это позволяет отделить результаты от диагностических сообщений при перенаправлении вывода.

#include <stdio.h>

int main(int argc, char *argv[]) {
    if (argc < 2) {
        fprintf(stderr, "Error: need an argument\n");
        return 1;
    }
    printf("%s\n", argv[1]);
    return 0;
}

Быстрая проверка

Проверьте, насколько хорошо Вы поняли соглашения для инструментов CLI.

Повторение

Вы создали полноценный инструмент CLI:

  • Определите интерфейс и объявите параметры со значениями по умолчанию.
  • Разберите флаги с помощью getopt; считайте позиционные аргументы начиная с optind.
  • Проверяйте ввод до выполнения работы.
  • Возвращайте осмысленные коды завершения и направляйте ошибки в stderr.

Часто задаваемые вопросы

Урок «Создание инструмента CLI» бесплатный?

Да — полный текст урока «Создание инструмента CLI» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C Academy, подпишись на CoddyKit PRO. Курс C Academy содержит 4 уроков всего.

Чему я научусь в уроке «Создание инструмента CLI»?

Практический пример Ты практикуешь C Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C Academy?

Предыдущий опыт не требуется. C Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Создание инструмента CLI»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C Academy?

Да. Каждый урок C Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. argc и argv
  2. Разбор параметров
  3. getopt
  4. Создание инструмента CLI
← Назад к C Academy