Mam program, który przyjmuje różne argumenty wiersza poleceń. Dla uproszczenia, będziemy powiedzieć, że trwa 3 flagi, -a
, -b
i -c
i użyć następującego kodu do analizowania moje argumenty:getopt nie wykrywa brakującego argumentu dla opcji
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;
}
}
Uwaga: i parametry b wykonać po flagi.
Ale napotkasz problem, jeśli przywołuję mój program powiedzieć z
./myprog -a -b parameterForB
gdzie zapomniałem parameterForA Z parameterForA (reprezentowaną przez OPTARG) jest zwracany jako -b
i parameterForB jest traktowany jako opcja bez parametru oraz optind jest ustawione na indeks parametruForB w argv.
Pożądanym zachowaniem w tej sytuacji jest zwrócenie ':'
po tym, jak nie znaleziono argumentu dla -a
, a Missing option.
zostanie wydrukowany jako błąd standardowy. Dzieje się tak tylko w przypadku, gdy -a
jest ostatnim parametrem przekazanym do programu.
Domyślam się, że pytanie brzmi: czy istnieje sposób, aby ustawić getopt()
, zakładając, że żadne opcje nie zaczną się od -
?
Ma to dodatkową zaletę polegającą na zezwalaniu na argumenty rozpoczynające się od '-' - po prostu nie mogą być poprzedzone białymi znakami. (np. 'my_prog -x-a') – Potatoswatter