C Academy · leksjon

getopt

Standardtolking av alternativer

Leksjon 3 av 413 trinn

getopt er en gratis leksjon i C Academy på CoddyKit. Dette er leksjon 3 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i C Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i C Academy inneholder totalt 4 leksjoner.

Hva er getopt?

getopt er en POSIX-funksjon som tolker alternativer med ett tegn for Dem, i tråd med standard Unix-konvensjoner.

Den finnes i <unistd.h> og fjerner det meste av den overflødige koden ved manuell flaggtolking.

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

Optstring

Det tredje argumentet til getopt er optstring: en liste over gyldige alternativbokstaver.

"abc" betyr at -a, -b og -c alle godtas som boolske flagg.

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

Tolkeløkken

getopt returnerer det neste alternativtegnet ved hvert kall, eller -1 når den er ferdig.

Det vanlige mønsteret er en while-løkke med en switch inni, som sender behandlingen videre basert på tegnet som ble returnert.

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

Alternativer med argumenter

Sett et kolon etter en bokstav i optstring for å angi at den tar en verdi. "o:" betyr at -o krever et argument.

Verdien blir tilgjengelig i den globale variabelen 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;
}

Kombinere flagg og verdi-alternativer

De kan blande boolske alternativer og alternativer som tar verdier, i én optstring. Her er -v et flagg, mens -n tar et tall.

getopt lar også brukere samle flagg, for eksempel -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;
}

Håndtere ukjente alternativer

Når getopt møter et alternativ som ikke finnes i optstring, returnerer den '?' og skriver ut en feil (med mindre De undertrykker meldingen).

Legg til en case '?' for å håndtere ugyldige inndata på en god måte.

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

Manglende nødvendige argumenter

Hvis et alternativ som tar en verdi, oppgis uten verdien, avhenger oppførselen til getopt av optstring.

Hvis optstring starter med et kolon (":o:"), returnerer getopt ':' ved et manglende argument, slik at De kan rapportere det nøyaktig.

#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: der tolkingen stoppet

Etter løkken inneholder den globale optind indeksen i argv til det første argumentet som ikke er et alternativ.

Bruk den til å behandle gjenværende posisjonsargumenter, for eksempel filnavn.

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

Undertrykke meldingene fra getopt

Som standard skriver getopt sine egne feilmeldinger til stderr. Sett den globale opterr til 0 for å undertrykke dem og håndtere feilene selv.

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

Identifisere det ugyldige alternativet

Når getopt returnerer '?', inneholder den globale optopt tegnet for alternativet som forårsaket feilen.

Dette lar Dem skrive ut en nyttig melding som angir nøyaktig hvilket flagg som var feil.

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

Merknad om lange alternativer

Vanlig getopt støtter bare alternativer med én bokstav. For lange alternativer som --verbose tilbyr GNU-systemer getopt_long i <getopt.h>.

Den bruker den samme løkken, men legger til en tabell med beskrivelser av lange alternativer.

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

Rask sjekk

Test forståelsen Deres av syntaksen for optstring i getopt.

Oppsummering

De har lært standardisert alternativtolking med getopt:

  • Gjenta løkken så lenge getopt(argc, argv, optstring) ikke er -1, og send behandlingen videre med en switch.
  • Et kolon etter en bokstav betyr at den tar en verdi, som finnes i optarg.
  • optind peker deretter på det første posisjonsargumentet.
  • De globale variablene opterr, optopt og et innledende kolon styrer feilhåndteringen.
Gratis å komme i gang

Lær deg C med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
39
Leksjoner
144

Ofte stilte spørsmål

Er leksjonen «getopt» gratis?

Ja – hele teksten i «getopt» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av C Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i C Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «getopt»?

Standardtolking av alternativer Du øver på C Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med C Academy?

Ingen tidligere erfaring er nødvendig. C Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.

Hvor lang tid tar leksjonen «getopt»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne C Academy-leksjonen?

Ja. Alle C Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. argc og argv
  2. Tolke alternativer
  3. getopt
  4. Bygge et CLI-verktøy
← Tilbake til C Academy