OK, ho cercato e trovato il seguente due StackOverflow argomenti che mi ha iniziato nella giusta direzione:getopt_long() - modo corretto per usarlo?
Argument-parsing helpers for C/UNIX
Pass arguments into C program from command line
NOTA: Tutto il codice è pseudo-codice. VERRÀ IL CODICE COMPILABILE QUANDO FUNZIONA.
Tuttavia, sono ancora completamente confuso su come utilizzare getopt_long() in C. Il programma che sto scrivendo è definito come avente i seguenti possibili tag (ma può includere tutti quelli di cui hai assolutamente bisogno, riempiendo il resto con valori vuoti):
id3tagEd filename -title "title" -artist "artist" -year 1991 -comment "comment" -album "album" -track 1
Ora, da quanto ho letto, ho bisogno di utilizzare una struttura per le lunghe opzioni, giusto? Se è così, ho scritto qualcosa sulla falsariga di questo:
struct fields field =
{
char *[] title;
char *[] artist;
char *[] album;
int year;
char *[] comment;
int track;
}
static struct options long_options[] =
{
{"title", 0, &field.title, 't'},
{"artist", 0, &field.artist, 'a'},
{"album", 0, &field.album, 'b'},
{"year", 0, &field.year, 'y'},
{"comment", 0, &field.comment, 'c'},
{"track", 0, &field.track, 'u'},
{0, 0, 0, 0}
}
Ora, da quello che ho raccolto, sarei definendolo tramite questo:
int option_index = 0;
int values = getopt_long(argc, argv, "tabycu", long_options, &option_index);
Da qui, potrei utilizzare esclusivamente il campo strutturare e fare ciò di cui ho bisogno all'interno del mio programma? Tuttavia, se questo è il caso, qualcuno può spiegare l'intera struttura long_options? Ho letto le pagine man e così, e sono solo completamente confuso. Rileggendo le pagine man, posso vedere che posso impostare le variabili su null, e dovrei impostare tutti i miei requisiti per le opzioni su "required_argument"? E quindi impostare le strutture tramite un ciclo while()? Tuttavia, vedo l'optarg in uso. Questo è impostato da getopt_long()? Oppure manca nell'esempio?
E un ultimo numero, avrò sempre un'opzione richiesta senza nome: nomefile, dovrei semplicemente usare argv [0] per ottenere l'accesso a questo? (Dato che posso presumere che sarà il primo).
Su una nota a margine, questo è correlato a un problema di compiti a casa, ma non ha nulla a che fare con il suo fissaggio, è più fondamentale, deve capire l'argomento passando e analizzando in C tramite riga di comando prima.
La definizione struct mostrati non verrà compilato. Si prega di fornire il codice compilabile. –
'char * [] title;' non è una dichiarazione valida. prova 'char * title [];' Nota che '& field.title' restituirà un' char *** 'che probabilmente non è quello che vuoi. –
Vedere le pagine man per getopt (3) e getopt_long (3), entrambi hanno esempi. –