Czy ktoś może mi pomóc z funkcją getopt?biblioteka przetwarzania wiersza poleceń - getopt
Kiedy należy wykonać następujące czynności w głównym:
char *argv1[] = {"testexec","-?"};
char *argv2[] = {"testexec","-m","arg1"};
int cOption;
/* test for -? */
setvbuf(stdout,(char*)NULL,_IONBF,0);
printf("\n argv1 ");
while ((cOption = getopt (2, argv1, "m:t:n:fs?")) != -1) {
switch(cOption){
case 'm':
printf("\n -m Arg : %s \n",optarg);
break;
case '?':
printf("\n -? Arg ");
break;
case 'n':
printf("\n -n Arg : %s \n",optarg);
break;
}
}
printf("\n argv2 ");
while ((cOption = getopt (3, argv2, "m:t:n:fs?")) != -1) {
switch(cOption){
case 'm':
printf("\n -m Arg : %s \n",optarg);
break;
case '?':
printf("\n -? Arg : %s \n",optarg);
break;
case 'n':
printf("\n -n Arg : %s \n",optarg);
break;
}
}
Używam tego kodu na rhel3 który wykorzystuje starą wersję libc. Nie wiem, który z nich jest dokładny.
Problem polega na tym, że getopt nie działa po raz drugi z argv2. Ale jeśli skomentuję pierwsze wywołanie getopt z argv1, to działa.
Czy ktoś może mi powiedzieć, co robię źle tutaj?
Dobra odpowiedź, ale chociaż to prawda, spróbowałem zmienić ją w przykładowym kodzie i nie rozwiązałem konkretnego problemu, o który pytano. –
David, masz rację. Właśnie zauważyłem ten błąd i zapomniałem o reszcie :) Poprawiłem odpowiedź, ponieważ zauważyłem, że jeśli zaktualizujesz wartość optind do 1, kod działa zgodnie z oczekiwaniami. Pozdrawiam: –
Uwaga: standard POSIX nie stwierdza, że zresetowanie optind do 1 zresetuje getopt() do stanu początkowego, szczególnie jeśli nie przeanalizowałeś całkowicie pierwszych argumentów. Na przykład, jeśli pierwszym argumentem jest -xy, a zatrzymasz się po przetworzeniu x, nie ma gwarancji, że reset optind działa. –