Come viene assegnata la variabile optind in C
-
Usa la funzione
getoptper analizzare le opzioni della riga di comando in C -
Usa le variabili
optindeoptargper elaborare gli elementiargvin 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