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ą instrukcjiswitch. - Dwukropek po literze oznacza, że opcja przyjmuje wartość dostępną w
optarg. optindwskazuje później pierwszy argument pozycyjny.- Zmienne globalne
opterr,optoptoraz 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.