Come viene assegnata la variabile optind in C
-
Usa la funzione
getopt
per analizzare le opzioni della riga di comando in C -
Usa le variabili
optind
eoptarg
per elaborare gli elementiargv
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"
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