0Pricing
C Academy · Lekcja

getopt

Standardowe parsowanie opcji

getopt to bezpłatna lekcja C Academy na CoddyKit. To lekcja 3 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.

Czym jest getopt?

getopt to funkcja POSIX, która analizuje za Państwa opcje jednoliterowe, zgodnie ze standardowymi konwencjami systemu Unix.

Znajduje się w <unistd.h> i eliminuje większość kodu pomocniczego potrzebnego przy ręcznym analizowaniu flag.

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

int main(int argc, char *argv[]) {
    int opt;
    while ((opt = getopt(argc, argv, "v")) != -1) {
        if (opt == 'v') printf("verbose on\n");
    }
    return 0;
}

Łańcuch optstring

Trzecim argumentem funkcji getopt jest optstring: lista prawidłowych liter opcji.

"abc" oznacza, że akceptowane są flagi logiczne -a, -b i -c.

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

int main(int argc, char *argv[]) {
    int opt;
    while ((opt = getopt(argc, argv, "abc")) != -1) {
        printf("saw option -%c\n", opt);
    }
    return 0;
}

Pętla analizowania

Przy każdym wywołaniu getopt zwraca znak następnej opcji albo -1, gdy analizowanie zostanie zakończone.

Standardowy wzorzec to pętla while z umieszczoną w niej instrukcją switch, która rozdziela obsługę na podstawie zwróconego znaku.

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

int main(int argc, char *argv[]) {
    int opt;
    while ((opt = getopt(argc, argv, "xy")) != -1) {
        switch (opt) {
            case 'x': printf("x set\n"); break;
            case 'y': printf("y set\n"); break;
        }
    }
    return 0;
}

Opcje z argumentami

Dwukropek po literze w łańcuchu optstring oznacza, że opcja przyjmuje wartość. "o:" oznacza, że -o wymaga argumentu.

Wartość jest dostępna w globalnej zmiennej optarg.

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

int main(int argc, char *argv[]) {
    int opt;
    while ((opt = getopt(argc, argv, "o:")) != -1) {
        if (opt == 'o') printf("output = %s\n", optarg);
    }
    return 0;
}

Łączenie flag i opcji z wartościami

W jednym łańcuchu optstring można połączyć opcje logiczne i opcje przyjmujące wartości. W tym przykładzie -v jest flagą, a -n przyjmuje liczbę.

getopt pozwala również łączyć flagi, na przykład -vn 5.

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

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

Obsługa nieznanych opcji

Gdy getopt napotka opcję, której nie ma w łańcuchu optstring, zwraca '?' i wyświetla błąd (chyba że komunikaty zostaną wyciszone).

Należy dodać case '?', aby odpowiednio obsłużyć nieprawidłowe dane wejściowe.

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

int main(int argc, char *argv[]) {
    int opt;
    while ((opt = getopt(argc, argv, "a")) != -1) {
        switch (opt) {
            case 'a': printf("a\n"); break;
            case '?': printf("unknown option\n"); break;
        }
    }
    return 0;
}

Brak wymaganych argumentów

Jeśli opcja przyjmująca wartość zostanie podana bez tej wartości, zachowanie getopt zależy od łańcucha optstring.

Rozpoczęcie łańcucha optstring od dwukropka (":o:") sprawia, że getopt zwraca ':' w przypadku brakującego argumentu, co pozwala precyzyjnie zgłosić problem.

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

int main(int argc, char *argv[]) {
    int opt;
    while ((opt = getopt(argc, argv, ":f:")) != -1) {
        if (opt == 'f') printf("file=%s\n", optarg);
        else if (opt == ':') printf("option needs a value\n");
    }
    return 0;
}

optind: miejsce zakończenia analizy

Po zakończeniu pętli globalna zmienna optind zawiera indeks w argv pierwszego argumentu niebędącego opcją.

Należy użyć jej do przetworzenia pozostałych argumentów pozycyjnych, takich jak nazwy plików.

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

int main(int argc, char *argv[]) {
    int opt;
    while ((opt = getopt(argc, argv, "v")) != -1) { }
    for (int i = optind; i < argc; i++)
        printf("positional: %s\n", argv[i]);
    return 0;
}

Wyciszanie komunikatów getopt

Domyślnie getopt wyświetla własne komunikaty o błędach na stderr. Należy ustawić globalną zmienną opterr na 0, aby je wyłączyć i samodzielnie obsługiwać błędy.

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

extern int opterr;

int main(int argc, char *argv[]) {
    opterr = 0;
    int opt;
    while ((opt = getopt(argc, argv, "a")) != -1) {
        if (opt == '?') printf("bad option, handled quietly\n");
    }
    return 0;
}

Identyfikowanie nieprawidłowej opcji

Gdy getopt zwraca '?', globalna zmienna optopt zawiera znak problematycznej opcji.

Pozwala to wyświetlić pomocny komunikat dokładnie wskazujący nieprawidłową flagę.

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

int main(int argc, char *argv[]) {
    int opt;
    while ((opt = getopt(argc, argv, "a")) != -1) {
        if (opt == '?')
            printf("Unrecognized option: -%c\n", optopt);
    }
    return 0;
}

Uwaga dotycząca długich opcji

Zwykły getopt obsługuje wyłącznie opcje jednoliterowe. W przypadku długich opcji, takich jak --verbose, systemy GNU udostępniają funkcję getopt_long w <getopt.h>.

Używa ona tej samej pętli, ale dodatkowo korzysta z tabeli deskryptorów długich opcji.

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

int main(int argc, char *argv[]) {
    printf("getopt parses %d short options\n", argc > 1 ? argc - 1 : 0);
    return 0;
}

Szybkie sprawdzenie

Sprawdź swoją wiedzę na temat składni łańcucha optstring funkcji getopt.

Podsumowanie

Dowiedzieli się Państwo, jak standardowo analizować opcje za pomocą getopt:

  • Należy wykonywać pętlę, dopóki getopt(argc, argv, optstring) nie zwróci -1, a obsługę rozdzielać za pomocą instrukcji switch.
  • Dwukropek po literze oznacza, że opcja przyjmuje wartość dostępną w optarg.
  • optind wskazuje później pierwszy argument pozycyjny.
  • Zmienne globalne opterr, optopt oraz początkowy dwukropek sterują obsługą błędów.

Często zadawane pytania

Czy lekcja „getopt” jest bezpłatna?

Tak — pełny tekst „getopt” 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 „getopt”?

Standardowe parsowanie opcji Ć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 3 z 4.

Ile czasu zajmuje lekcja „getopt”?

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