Вопрос

Мой аргумент такой

./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;

Это схватило первое значение, образующую меня как обычно, а затем искал второе, требуемое значение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top