Функция getopt_long () с пользовательскими аргументами argc и argv - PullRequest
1 голос
/ 28 октября 2011

У меня проблемы с использованием функции getopt_long () с пользовательскими аргументами argc и argv.

Я получаю аргументы в строке вместо реальных аргументов командной строки.Затем из этой строки были построены new_argc и new_argv для использования с getopt_long ().Но getopt_long () завершается неудачно при первом вызове.возвращает EOF и optarg = NULL.

string is "-c 10.30.99.41" 
new_argc = 3
new_argv[0]=>./prog_name
new_argv[1]=>-c
new_argv[2]=>10.30.99.41

getopt_long работает нормально, если я передаю аргументы командной строки.Так что мои короткие и длинные варианты верны.Но если я пропущу new_argc и new_argv, то произойдет сбой.

Я уверен, что мои короткие и длинные параметры верны, а argv равен NULL.Я извиняюсь, я не могу опубликовать больше кода здесь.

Сомневаюсь, можно ли использовать getopt_long с собственными argc и argv.Я подозреваю, что он работает только с реальными argc и argv, потому что он должен ссылаться на некоторый другой код в libc, связанный с argc, argv.Есть комментарии?

option = getopt_long( new_argc, new_argv, short_options, long_options, NULL );

1 Ответ

5 голосов
/ 28 октября 2011

EDIT:

"Переменная optind - это индекс следующего элемента, который будет обработан в argv. Система инициализирует это значение равным 1. Вызывающая сторона может сбросить его на 1, чтобы возобновить сканирование того же самого argv.или при сканировании нового вектора аргумента. "

Итак, да.Вы можете использовать getopt_long для повторного сканирования аргументов или другого списка аргументов.Однако, если кто-то ранее вызывал getopt_long, вы должны установить глобальную переменную optind равной 1.

Помните, что argv в main () имеет значение NULL и заканчивается argc, то есть;argv [argc] == NULL.Таким образом, вы, вероятно, должны убедиться, что последний элемент вашего new_argv является указателем NULL.

(Обратите внимание, пожалуйста, покажите весь соответствующий код при публикации, трудно догадаться, что это за ошибка, например, показыватьчто такое short_options, long_option, как вы на самом деле строите new_argv, объявления переменных и т. д.)

...