Come viene assegnata la variabile optind in C

Jinku Hu 12 ottobre 2023
  1. Usa la funzione getopt per analizzare le opzioni della riga di comando in C
  2. Usa le variabili optind e optarg per elaborare gli elementi argv in C
Come viene assegnata la variabile optind in C

Questo articolo mostrerà diversi metodi su come la variabile optind viene assegnata in C.

Usa la funzione getopt per analizzare le opzioni della riga di comando in C

I tipici programmi da riga di comando su sistemi basati su UNIX accettano argomenti e opzioni. Le opzioni sono solitamente specificate con caratteri che seguono i trattini e ogni carattere univoco indica informazioni sull’argomento specificato o restituisce il comportamento specifico del programma da eseguire. Le opzioni possono avere argomenti obbligatori o facoltativi; in quest’ultimo caso, è comune per i programmi consentire il raggruppamento delle opzioni dopo un singolo trattino e l’unico argomento può essere passato alla fine del comando.

La funzione getopt viene utilizzata per analizzare le opzioni e recuperare gli argomenti dati dal programma, ed eseguire i percorsi di codice corrispondenti in base all’input. getopt accetta tre argomenti, i primi due dei quali sono argc e argv passati alla funzione main. Il terzo argomento è optstring - un puntatore a una stringa di caratteri che rappresenta i caratteri dell’opzione legittima. getopt deve essere chiamato in successione fino a quando non vengono recuperate tutte le opzioni.

Nell’esempio seguente, mostriamo un programma che accetta opzioni con caratteri p e x. Nota che optstring inizia con i due punti che indicano il valore che deve essere restituito dalla chiamata getopt quando vengono incontrati gli argomenti mancanti. Inoltre, i due punti specificati dopo un carattere (ad esempio p) indicano che l’argomento è richiesto per l’opzione; due due punti indicano che l’argomento è facoltativo. Lo stesso carattere di opzione può essere passato più volte sulla riga di comando. La funzione getopt restituisce il carattere dell’opzione se ha successo o restituisce il carattere ? se il carattere dell’opzione incontrato non è in optstring.

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

int main(int argc, char *argv[]) {
  int opt, xnum = 0;
  char *pstr = NULL;

  while ((opt = getopt(argc, argv, ":p:x")) != -1) {
    printf("opt = %3d (%c); optind = %d\n", opt, opt, optind);

    switch (opt) {
      case 'p':
        pstr = optarg;
        break;
      case 'x':
        xnum++;
        break;
      case ':':
        fprintf(stderr,
                "Missing argument!\n"
                "Usage: %s [-p arg] [-x]\n",
                argv[0]);
        exit(EXIT_FAILURE);
      case '?':
        fprintf(stderr,
                "Unrecognized option!\n"
                "Usage: %s [-p arg] [-x]\n",
                argv[0]);
        exit(EXIT_FAILURE);
      default:
        fprintf(stderr, "Unexpected case in switch()");
        exit(EXIT_FAILURE);
    }
  }

  exit(EXIT_SUCCESS);
}

Comando di esempio:

./program_name -p hello -p there

Produzione:

opt = 112 (p); optind = 3
opt = 112 (p); optind = 5

Usa le variabili optind e optarg per elaborare gli elementi argv in C

L’esempio di codice precedente mostra il tipico utilizzo di getopt, in cui la funzione viene chiamata da un’espressione di cicli while finché non restituisce il codice di errore -1. Nel frattempo, l’istruzione switch controlla i possibili valori restituiti da getopt per eseguire i blocchi di codice corrispondenti. Nota che la variabile optind rappresenta l’indice dell’elemento successivo in argv, ed è inizializzata a 1 prima della prima chiamata a getopt. D’altra parte, optarg è una variabile esterna che punta all’argomento che segue il carattere di opzione corrente. Se l’opzione non include un argomento, allora optarg è impostato a zero. Il prossimo esempio di codice mostra come salvare l’argomento puntato dalla variabile optarg e quindi operare su di esso secondo necessità. Tieni presente che l’argomento può seguire l’opzione senza un delimitatore di spazio.

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

int main(int argc, char *argv[]) {
  int opt, xnum = 0;
  char *pstr = NULL;

  while ((opt = getopt(argc, argv, ":p:x")) != -1) {
    printf("opt = %3d (%c); optind = %d\n", opt, opt, optind);

    switch (opt) {
      case 'p':
        pstr = optarg;
        break;
      case 'x':
        xnum++;
        break;
      case ':':
        fprintf(stderr,
                "Missing argument!\n"
                "Usage: %s [-p arg] [-x]\n",
                argv[0]);
        exit(EXIT_FAILURE);
      case '?':
        fprintf(stderr,
                "Unrecognized option!\n"
                "Usage: %s [-p arg] [-x]\n",
                argv[0]);
        exit(EXIT_FAILURE);
      default:
        fprintf(stderr, "Unexpected case in switch()");
        exit(EXIT_FAILURE);
    }
  }

  if (xnum != 0) printf("-x was specified (count=%d)\n", xnum);
  if (pstr != NULL) printf("-p was specified with the value \"%s\"\n", pstr);
  if (optind < argc)
    printf("First non-option argument is \"%s\" at argv[%d]\n", argv[optind],
           optind);

  exit(EXIT_SUCCESS);
}

Comando di esempio:

./program_name -p hello

Produzione:

opt = 112 (p); optind = 3
-p was specified with the value "hello"
Autore: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook