LINUX.ORG.RU

Индекс начала getopt_long

 


0

1

Вызов: ./program param -s value --user value2.

Чтобы разобрать аргументы использую getopt_long. Первый параметр (param) обязательный и его я получаю без getopt_long. Следующие уже через ее. Но эта функция начинает парсить аргументы начиная с program, чего мене не нужно.

В качестве решения можно создавать дополнительный массив, перекопировав в его нужные аргументы.

Существует ли способ обойтись без массива, сказав функции начинать работать после второго индекса?



Последнее исправление: cetjs2 (всего исправлений: 1)

Тащемта есть стандарт - свободные аргументы идут после ключей, это все знают и писать аргумент без ключа никто не будет, никто же не будет и это парсить, поэтому работай с ./program -s value --user value2 param.

Но если ты извращенец и неадекват, можно сделать так:

const char* saved_param = argv[1];
argv[1] = argv[0];
argv++;
argc--;

Этот код под GPLv3+ если что.

slovazap ★★★★★
()
Ответ на: комментарий от slovazap

Тащемта есть стандарт - свободные аргументы идут после ключей, это все знают и писать аргумент без ключа никто не будет

Нет такого стандарта, не редко вторым параметром идёт имя (под)комнады после чего уже сами параметры. Например, все VCS так устроены и не только.

mashina ★★★★★
()

The variable optind is the index of the next element to be processed in argv. The system initializes this value to 1.

Тебе, соответственно, нужно положить туда 2.

Gvidon ★★★★
()
Ответ на: комментарий от mashina

Например, все VCS так устроены и не только.

Ну нормальные vcs устроены так, что foo bar <args> зовёт foo-bar <args>, что стандарту соответствует. А ненормальные ещё и ключи разделяют на принадлежащие команде и подкоманде, и не дай бог их куда-то туда написать. Гореть им в аду, только и всего.

slovazap ★★★★★
()
Ответ на: комментарий от slovazap

Ну нормальные vcs устроены так, что foo bar <args> зовёт foo-bar <args>, что стандарту соответствует.

Такого стандарта нет, это тоже твои фантазии. Кому-то удобно по каким-либо причинам делать реализации подкоманды в виде отдельных бинарей, а где-то удобнее всё засунуть в один бинарь.

А ненормальные ещё и ключи разделяют на принадлежащие команде и подкоманде, и не дай бог их куда-то туда написать.

С точно таким же успехом можешь засунуть ключ от чужой (под)команды и получить аналогичный результат. В правильно разработанном интерфейсе такие эффекты сведены к минимуму. Твои фобии не основаны на объективных фактах.

Гореть им в аду, только и всего.

А где должны гореть кадры вроде тебя, т.е. с закоренелым стереотипным мышлением?

mashina ★★★★★
()

Нафига ты в це++ используешь getopt_long, если есть более приличные вещи, которые позволяют не париться с хелпами и т.п.?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Пы.Сы. Оно еще и умеет неоднократные аргументы!

Eddy_Em ☆☆☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.