Ho un programma che accetta vari argomenti della riga di comando. Per motivi di semplificazione, diremo che ci vuole 3 bandiere, -a
, -b
, e -c
, e utilizzare il seguente codice per analizzare i miei argomenti:getopt non riesce a rilevare l'argomento mancante per l'opzione
int c;
while((c = getopt(argc, argv, ":a:b:c")) != EOF)
{
switch (c)
{
case 'a':
cout << optarg << endl;
break;
case 'b':
cout << optarg << endl;
break;
case ':':
cerr << "Missing option." << endl;
exit(1);
break;
}
}
nota: a, e parametri b prendere dopo la bandiera.
Ma mi imbatto in un problema se invoco il mio programma dire con
./myprog -a -b parameterForB
dove ho dimenticato parameterForA, il parameterForA (rappresentato da OPTARG) viene restituito come -b
e parameterForB è considerata un'opzione con nessun parametro e optind è impostato sull'indice di parameterForB in argv.
Il comportamento desiderato in questa situazione sarebbe che ':'
viene restituito dopo che nessun argomento è stato trovato per -a
e Missing option.
viene stampato per errore standard. Tuttavia, ciò si verifica solo nel caso in cui -a
sia l'ultimo parametro passato nel programma.
Credo che la domanda sia: esiste un modo per fare in modo che getopt()
assuma che nessuna opzione inizi con -
?
Questo ha il vantaggio aggiuntivo di consentire effettivamente argomenti che iniziano con '-' - non possono essere preceduti solo da spazi bianchi. (ad es. 'my_prog -x-a') – Potatoswatter