0Pricing
C Academy · Lezione

getopt

Analisi standard delle opzioni

getopt è una lezione C Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C Academy include 4 lezioni in totale.

Che cos'è getopt?

getopt è una funzione POSIX che analizza al posto Suo le opzioni a carattere singolo, seguendo le convenzioni Unix standard.

Si trova in <unistd.h> e riduce notevolmente il codice ripetitivo dell'analisi manuale dei 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;
}

La optstring

Il terzo argomento di getopt è la optstring: un elenco delle lettere delle opzioni valide.

"abc" significa che -a, -b e -c sono tutti flag booleani accettati.

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

Il ciclo di analisi

getopt restituisce a ogni chiamata il carattere dell'opzione successiva, oppure -1 quando ha terminato.

Lo schema standard consiste in un ciclo while con uno switch al suo interno per gestire il carattere restituito.

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

Opzioni con argomenti

Inserisca due punti dopo una lettera nella optstring per indicare che l'opzione accetta un valore. "o:" significa che -o richiede un argomento.

Il valore diventa disponibile nella variabile globale 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;
}

Combinazione di flag e opzioni con valore

È possibile combinare opzioni booleane e opzioni che accettano valori nella stessa optstring. Qui -v è un flag e -n accetta un numero.

getopt consente inoltre agli utenti di raggruppare i flag, ad esempio -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;
}

Gestione delle opzioni sconosciute

Quando getopt incontra un'opzione non presente nella optstring, restituisce '?' e stampa un errore (a meno che non venga disattivato).

Aggiunga un case '?' per gestire l'input non valido in modo appropriato.

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

Argomenti obbligatori mancanti

Se un'opzione che accetta un valore viene fornita senza il relativo valore, il comportamento di getopt dipende dalla optstring.

Iniziando la optstring con due punti (":o:"), getopt restituisce ':' quando manca un argomento, consentendo di segnalarlo con precisione.

#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: dove si è fermata l'analisi

Dopo il ciclo, la variabile globale optind contiene l'indice in argv del primo argomento non opzionale.

La utilizzi per elaborare gli argomenti posizionali rimanenti, come i nomi dei file.

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

Disattivazione dei messaggi di getopt

Per impostazione predefinita, getopt stampa i propri messaggi di errore su stderr. Imposti la variabile globale opterr su 0 per sopprimerli e gestire autonomamente gli errori.

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

Identificazione dell'opzione errata

Quando getopt restituisce '?', la variabile globale optopt contiene il carattere dell'opzione che ha causato l'errore.

In questo modo può stampare un messaggio utile indicando esattamente quale flag non era corretto.

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

Nota sulle opzioni lunghe

Il semplice getopt supporta solo le opzioni a carattere singolo. Per le opzioni lunghe come --verbose, i sistemi GNU forniscono getopt_long in <getopt.h>.

Utilizza lo stesso ciclo, ma aggiunge una tabella di descrittori delle opzioni lunghe.

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

Verifica rapida

Verifichi la Sua comprensione della sintassi della optstring di getopt.

Riepilogo

Ha imparato l'analisi standard delle opzioni con getopt:

  • Esegua il ciclo finché getopt(argc, argv, optstring) non è -1, gestendo il risultato con uno switch.
  • Due punti dopo una lettera indicano che l'opzione accetta un valore, disponibile in optarg.
  • optind punta al primo argomento posizionale successivo.
  • Le variabili globali opterr, optopt e i due punti iniziali controllano la gestione degli errori.

Domande Frequenti

La lezione «getopt» è gratuita?

Sì — il testo completo di «getopt» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C Academy, passa a CoddyKit PRO. Il corso C Academy include 4 lezioni in totale.

Cosa imparerò in «getopt»?

Analisi standard delle opzioni Eserciti C Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C Academy?

Non è richiesta alcuna esperienza precedente. C Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «getopt»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C Academy?

Sì. Ogni lezione C Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. argc e argv
  2. Analizzare le opzioni
  3. getopt
  4. Creare uno strumento CLI
← Torna a C Academy