2013-11-02 8 views
1

Я хотел, чтобы программа выполнила «execvp (argv [1], argv + 1);» если первый аргумент не определен, но getopt разбирает все аргументы, начинающиеся с «-». Как игнорировать все аргументы после первого неопределенного аргумента? Можно ли использовать getopt? В настоящее время у меня есть код:Linux C getopt игнорировать после первого неопределенного аргумента

#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <getopt.h> 
#include <string.h> 
void print_usage() { 
    printf("Usage: here print usage\n"); 
} 

int main(int argc, char *argv[]) { 
    int option = 0; 
char user[32]={0}, command[50]={0}; 
while ((option = getopt(argc, argv,"c:u:h")) != -1) { 
    switch (option) { 
     case 'c' : strcpy(command,optarg); 
      break; 
     case 'u' : strcpy(user,optarg); 
      break; 
     case 'h' : print_usage(); 
        exit(EXIT_SUCCESS); 
      break; 
     default: 
      print_usage(); 
      exit(EXIT_SUCCESS); 
    } 
} 

if(strlen(user)!=0) { 
    if (strlen(command)!=0) 
     printf("execute %s for %s\n",command,user); 
    else 
     printf("please specify command\n"); 
} 
else { 
    if (strlen(command)!=0) 
     printf("please specify user\n"); 
    else if (argc > 2) 
     printf("execute %s for everyone\n",argv[1]); 

} 

return 0; 

}

При выполнении, я получил:

./thisprogram ls -l 
./thusprogram: invalid option -- 'l' 

Я хотел бы сделать так;

./thisprogram ls -l/
razem 52 
lrwxrwxrwx 1 root root  7 05-31 20:40 bin -> usr/bin 
drwxr-xr-x 5 root root 4096 10-21 22:44 boot 
drwxr-xr-x 19 root root 3160 11-02 17:10 dev 

и так далее ... но я понятия не имею. С уважением K.

ответ

4

Просто прекратите синтаксический анализ, когда вы столкнетесь с неизвестным аргументом.

int done = 0; 
while (!done && (option = getopt(argc, argv,"c:u:h")) != -1) { 
    switch (option) { 
    ... 
    default: 
     done = 1; 
     break; 
    } 
} 

(или если вы хотите, используйте case '?': вместо default: случае, как Getopt возвращается '?', Когда он встречает неизвестный аргумент)

 Смежные вопросы

  • Нет связанных вопросов^_^