Создание инструмента 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 — локальная установка не требуется.
Все уроки этого курса
- argc и argv
- Разбор параметров
- getopt
- Создание инструмента CLI