C getopt multiple value

Mój argument jest taki

./a.out -i file1 file2 file3

Jak mogę wykorzystać getopt(), aby uzyskać 3 (lub więcej) pliki wejściowe? Robię coś takiego:

while ((opt = getopt(argc, argv, "i:xyz.."))!= -1){
  case 'i':
     input = optarg; 
     break;
  ...
}

I get just the file1; how to get file2, file3?

Author: Jonathan Leffler, 2010-10-15

4 answers

Jeśli musisz, możesz zacząć od argv[optind] i zwiększyć optind siebie. Polecam jednak, ponieważ uważam tę składnię za słabą formę. (Skąd możesz wiedzieć, kiedy dotarłeś do końca listy? Co jeśli ktoś ma plik o nazwie - jako pierwszy znak?)

Myślę, że lepiej byłoby zmienić składnię NA albo:

/a.out -i file1 -i file2 -i file3

Lub traktować listę plików jako parametry pozycyjne:

/a.out file1 file2 file3
 9
Author: jamesdlin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-15 03:11:07

Wiem, że to dość stare, ale natknąłem się na to w poszukiwaniu rozwiązania.

while((command = getopt(argc, argv, "a:")) != -1){

    switch(command){
        case 'a':

        (...)

        optind--;
        for( ;optind < argc && *argv[optind] != '-'; optind++){
              DoSomething( argv[optind] );         
        }

        break;
    }

Odkryłem, że int optind (extern używany przez getopt () ) wskazuje na następną pozycję po' current argv ' wybranym przez getopt () ; Dlatego zmniejszam go na początku.

Przede wszystkim dla pętli sprawdza, czy wartość bieżącego argumentu mieści się w granicach argv (argc jest długością tablicy, więc ostatnia Pozycja w tablicy argv to argc-1 ). Druga część && porównuje, jeśli pierwszy znak następnego argumentu to' -'. Jeśli pierwszy znak jest' -', wtedy zabraknie nam kolejnych wartości dla bieżącego argumentu else argv [optind] jest naszą następną wartością. I tak dalej, dopóki argv się nie skończy lub nie zabraknie wartości argumentu.

Na końcu przyrostu optind aby sprawdzić następne argv.

Zauważ, że ponieważ sprawdzamy 'optind ' Pierwsza Druga część warunku nie zostanie wykonana, chyba że pierwsza część jest prawdziwa, więc nie ma obaw o odczyt poza granicami tablicy.

PS jestem całkiem nowym programistą C jeśli ktoś ma jakieś poprawki lub krytykę proszę się podzielić.

 27
Author: GoTTimw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-02 14:55:38

Zauważ, że rozszerzenie permutacji argumentu niezgodnego z glibc złamie każdą próbę użycia wielu argumentów do -i w ten sposób. A w systemach Nie-GNU, "drugi argument do -i" będzie interpretowany jako pierwszy argument nie-opcji, wstrzymując dalsze parsowanie opcji. Mając na uwadze te problemy, rzucę getopt i napiszę własny parser linii poleceń, jeśli chcesz użyć tej składni, ponieważ nie jest to składnia obsługiwana przez getopt.

 5
Author: R..,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-15 04:09:16

Spojrzałem i wypróbowałem powyższy kod, ale znalazłem swoje rozwiązanie trochę łatwiejsze i działało lepiej dla mnie:

Obsługa, którą chciałem:

-m mux_i2c_group mux_i2c_out

(Wymagane 2 argumenty).

Oto Jak to dla mnie wygląda:

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;

To chwycił pierwszą wartość formularza mnie jak zwykle, a następnie po prostu szukał drugiej, wymaganej wartości.

 4
Author: Andrew Ward,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-05 14:40:32