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
?
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
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ć.
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
.
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.
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