C Гестоп Многократное значение
Вопрос
Мой аргумент такой
./a.out -i file1 file2 file3
Как я могу использовать getopt()
Чтобы получить 3 (или более) входных файлов? Я делаю что-то вроде этого:
while ((opt = getopt(argc, argv, "i:xyz.."))!= -1){
case 'i':
input = optarg;
break;
...
}
Я получаю только file1
; как получить file2
, file3
?
Решение
Если вы должны, вы можете начать в argv[optind]
и увеличение optind
сами. Однако я бы порекомендовал против этого с тех пор, как считаю, что синтаксис будет плохой формой. (Как бы вы знали, когда вы достигли конца списка? Что если у кого-то есть файл с именем -
Как первый персонаж?)
Я думаю, что еще лучше изменить свой синтаксис либо:
/a.out -i file1 -i file2 -i file3
Или для обработки списка файлов в качестве параметров позиционирования:
/a.out file1 file2 file3
Другие советы
Я знаю, что это довольно старое, но я наткнулся на это в моем поиске решения.
while((command = getopt(argc, argv, "a:")) != -1){
switch(command){
case 'a':
(...)
optind--;
for( ;optind < argc && *argv[optind] != '-'; optind++){
DoSomething( argv[optind] );
}
break;
}
я нашел это int optind. (External используется getopt () ) указывает на следующую позицию после «текущего аргввыбран getopt (); Вот почему я уменьшаю его в начале.
Прежде всего для петли Проверяет, если значение текущего аргумента находится в пределах границ аргв (argc. это длина массива, поэтому последняя позиция в массиве ARGV argc-1.). Вторая часть && сравнивает, если первый шанр следующего аргумента «-». Если первый символ «-», то мы исчерпываем следующие значения для текущего аргумента argv [Optind] - наше следующее значение. И так до тех пор, пока ARGV не будет закончен, или аргумент не работает из ценностей.
В конце концов Optind. Чтобы проверить на следующий ARGV.
Обратите внимание, что потому что мы проверяемOptind <Argc.«Первая вторая часть условия не будет выполнена, если первая часть не верна, поэтому никаких забот об чтении за пределами границ массива.
PS Я совсем новый программист C, если у кого-то улучшения или критика, пожалуйста, поделитесь этим.
Обратите внимание, что расширение перестановки неконформантного аргумента Glibc сломает любую попытку использовать несколько аргументов -i
таким образом. И в системах без GNU, «второй аргумент для -i
«Будет интерпретировать как первый неоперационный аргумент, останавливая любые дополнительные параметры. С учетом этих вопросов, я бы бросил getopt
И напишите свой собственный анализатор командной строки, если вы хотите использовать этот синтаксис, поскольку это не синтаксис, поддерживаемый getopt
.
Я посмотрел и попробовал код выше, но я нашел свое решение немного проще и лучше сработал для меня:
Обработка, которую я хотел, было:
-m mux_i2c_group mux_i2c_out
(2 аргумента).
Вот как это вышло для меня:
case 'm':
mux_i2c_group = strtol(optarg, &ch_p, 0);
if (optind < argc && *argv[optind] != '-'){
mux_i2c_out = strtol(argv[optind], NULL, 0);
optind++;
} else {
fprintf(stderr, "\n-m option require TWO arguments <mux_group> "
"<mux_out>\n\n");
usage();
}
use_mux_flag = 1;
break;
Это схватило первое значение, образующую меня как обычно, а затем искал второе, требуемое значение.