0Pricing
C Academy · Lekcja

Budowanie narzędzia CLI

Praktyczny przykład

Budowanie narzędzia CLI to bezpłatna lekcja C Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C Academy zawiera 4 lekcji w sumie.

Łączenie wszystkiego

Teraz połączymy argumenty, opcje i analizowanie w małe, ale kompletne narzędzie CLI.

Przykładem będzie narzędzie do formatowania liczb, które odczytuje wartość oraz kilka opcji, a następnie wyświetla wynik.

#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;
}

Projektowanie interfejsu

Dobre narzędzia CLI definiują swój interfejs z wyprzedzeniem. Nasze będzie akceptować:

  • -v — szczegółowe dane wyjściowe
  • -r N — powtórzenie danych wyjściowych N razy
  • jeden argument pozycyjny: tekst do wyświetlenia
#include <stdio.h>

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

Deklarowanie ustawień

Każde konfigurowalne zachowanie należy przechowywać w zmiennej z rozsądną wartością domyślną. Dzięki temu analizowanie jest oddzielone od właściwego działania programu.

#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;
}

Analizowanie za pomocą getopt

Należy użyć getopt, aby wypełnić ustawienia flag. Opcja -r przyjmuje wartość, dlatego jej wpis w łańcuchu optstring to 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;
}

Odczytywanie argumentu pozycyjnego

Po zakończeniu działania getopt zmienna optind wskazuje pierwszy argument niebędący opcją. Pobieramy stamtąd tekst.

Jeśli go nie ma, wyświetlamy sposób użycia programu i kończymy działanie z kodem błędu.

#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;
}

Sprawdzanie danych liczbowych

Solidne narzędzie sprawdza, czy opcja -r otrzymała sensowną liczbę. Należy odrzucić zerową lub ujemną liczbę powtórzeń.

#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;
}

Wykonywanie zadania

Po przeanalizowaniu i sprawdzeniu ustawień należy wykonać właściwe zadanie. W tym przykładzie wyświetlamy tekst repeat razy.

#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;
}

Szczegółowe dane wyjściowe

Flaga szczegółowego trybu może dodawać informacje diagnostyczne. Takie wyświetlanie należy uzależnić od flagi, aby zwykłe dane wyjściowe pozostały przejrzyste.

#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;
}

Kompletne narzędzie

Oto pełny program łączący wszystkie elementy: analizowanie, sprawdzanie, a następnie wykonanie.

#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;
}

Kody zakończenia mają znaczenie

Narzędzia CLI komunikują powodzenie za pomocą kodu zakończenia. W przypadku powodzenia należy zwrócić 0, a w przypadku błędów wartość różną od zera.

Skrypty i inne programy korzystają z tego kodu, aby zdecydować, co zrobić dalej.

#include <stdio.h>

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

Zapisywanie błędów na stderr

Zgodnie z konwencją zwykłe dane wyjściowe trafiają do stdout, a błędy do stderr za pośrednictwem fprintf(stderr, ...).

Pozwala to oddzielić wyniki od diagnostyki podczas przekierowywania danych wyjściowych.

#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;
}

Szybkie sprawdzenie

Sprawdź swoją wiedzę na temat konwencji dotyczących narzędzi CLI.

Podsumowanie

Zbudowali Państwo kompletne narzędzie CLI:

  • Zdefiniuj interfejs i zadeklaruj ustawienia z wartościami domyślnymi.
  • Analizuj flagi za pomocą getopt; odczytuj argumenty pozycyjne od indeksu optind.
  • Sprawdzaj dane wejściowe przed wykonaniem zadania.
  • Zwracaj znaczące kody zakończenia i wysyłaj błędy do stderr.

Często zadawane pytania

Czy lekcja „Budowanie narzędzia CLI” jest bezpłatna?

Tak — pełny tekst „Budowanie narzędzia CLI” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C Academy, przejdź na CoddyKit PRO. Kurs C Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Budowanie narzędzia CLI”?

Praktyczny przykład Ćwiczysz C Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C Academy?

Nie wymagamy żadnego doświadczenia. C Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Budowanie narzędzia CLI”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C Academy?

Tak. Każda lekcja C Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. argc i argv
  2. Parsowanie opcji
  3. getopt
  4. Budowanie narzędzia CLI
← Powrót do C Academy