2013-07-26 19 views
8

Ho un programma che accetta più argomenti da riga di comando, quindi sto usando getopt. Uno dei miei argomenti contiene una stringa come parametro. Esiste comunque la possibilità di ottenere quella stringa attraverso la funzione getopt o dovrei ottenerla attraverso l'array argv []? Inoltre può getopt leggere argomenti come -file? Tutti gli argomenti che ho visto fino ad ora hanno solo un carattere come -aGetopt- Passing parametro stringa per argomento

EDIT

Dalle risposte qui sotto ho scritto un programma da utilizzare getopt_long(), ma l'istruzione switch riconosce solo l'argomento quando Uso l'argomento del personaggio e non l'argomento lungo. Non sono sicuro del perché questo accada. Passando gli argomenti -mf -file sample non vedo le istruzioni di stampa.

EDIT

Ho provato inserendo gli argomenti di comando come --file e quindi ha funzionato. Non è possibile farlo con solo -file?

static struct option long_options[] = 
{ 
    {"mf", required_argument, NULL, 'a'}, 
    {"md", required_argument, NULL, 'b'}, 
    {"mn", required_argument, NULL, 'c'}, 
    {"mw", required_argument, NULL, 'd'}, 
    {"lf", required_argument, NULL, 'e'}, 
    {"ld", required_argument, NULL, 'f'}, 
    {"ln", required_argument, NULL, 'g'}, 
    {"lw", required_argument, NULL, 'h'}, 
    {"rf", required_argument, NULL, 'i'}, 
    {"rd", required_argument, NULL, 'j'}, 
    {"rn", required_argument, NULL, 'k'}, 
    {"rw", required_argument, NULL, 'l'}, 
    {"df", required_argument, NULL, 'm'}, 
    {"dd", required_argument, NULL, 'n'}, 
    {"dn", required_argument, NULL, 'o'}, 
    {"dw", required_argument, NULL, 'p'}, 
    {"file", required_argument, NULL, 'q'}, 
    {NULL, 0, NULL, 0} 
}; 
int ch=0; 
while ((ch = getopt_long(argc, argv, "abcdefghijklmnopq:", long_options, NULL)) != -1) 
{ 
    // check to see if a single character or long option came through 
     switch (ch){ 
     case 'a': 
      cout<<"title"; 
      break; 
     case 'b': 

      break; 
     case 'c': 

      break; 
     case 'd': 

      break; 
     case 'e': 

      break; 
     case 'f': 

      break; 
     case 'g': 

      break; 
     case 'h': 

      break; 
     case 'i': 

      break; 
     case 'j': 

      break; 
     case 'k': 

      break; 
     case 'l': 

      break; 
     case 'm': 

      break; 
     case 'n': 

      break; 
     case 'o': 

      break; 
     case 'p': 

      break; 
     case 'q': 
      cout<<"file"; 
      break; 
     case '?': 
      cout<<"wrong message" 
      break; 
    } 
} 

risposta

15

Leggi man getopthttp://linux.die.net/man/3/getopt

optstring è una stringa contenente i caratteri un'opzione legittima. Se un carattere è seguito da due punti, l'opzione richiede un argomento , quindi getopt() posiziona un puntatore al testo seguente nello stesso argv-elemento o nel testo del seguente argv-elemento, in optarg . Due due punti indicano che un'opzione richiede un argomento opzionale; se c'è il testo nell'argg-elemento corrente (ad esempio, nella stessa parola dell'opzione , ad esempio "-oarg"), quindi viene restituito in optarg, altrimenti optarg è impostato su zero.

Un codice di esempio:

#include <stdio.h> 
#include <unistd.h> 

int main (int argc, char *argv[]) 
{ 
    int opt; 
    while ((opt = getopt (argc, argv, "i:o:")) != -1) 
    { 
    switch (opt) 
    { 
     case 'i': 
       printf ("Input file: \"%s\"\n", optarg); 
       break; 
     case 'o': 
       printf ("Output file: \"%s\"\n", optarg); 
       break; 
    } 
    } 
    return 0; 
} 

Qui nel optstring è "i: o:" i due punti ':' carattere dopo ogni carattere della stringa dice che quelle opzioni richiederanno un argomento. Puoi trovare argomento come stringa nella variabile globale optarg. Vedi il manuale per i dettagli e altri esempi.

Per più opzioni di carattere, vedere le lunghe opzioni getopt_long. Controlla il manuale per gli esempi.

EDIT in risposta al singolo '-' opzioni lunghe:

Dalle pagine man

getopt_long_only() è come getopt_long(), ma '-' così come "- - "può indicare una lunga opzione. Se un'opzione che inizia con '-' (non "-") non corrisponde a un'opzione lunga, ma corrisponde a un'opzione breve, viene invece analizzata come opzione breve.

Controllare il manuale e provarlo.

+0

Ho provato con getopt_long, ma il mio programma non riconosce gli argomenti. Ho aggiunto il mio codice qui sopra. – AndroidDev93

+0

@ AndroidDev93: verifica la mia modifica – phoxis

8

Per specificare che un flag richiede un argomento, aggiungere un ':' subito dopo il flag nella variabile short_opt. Per usare argomenti lunghi, usa getopt_long().

Ecco un programma rapido esempio:

#include <getopt.h> 
#include <stdio.h> 

int main(int argc, char * argv[]); 

int main(int argc, char * argv[]) 
{ 
    int    c; 
    const char * short_opt = "hf:"; 
    struct option long_opt[] = 
    { 
     {"help",   no_argument,  NULL, 'h'}, 
     {"file",   required_argument, NULL, 'f'}, 
     {NULL,   0,     NULL, 0 } 
    }; 

    while((c = getopt_long(argc, argv, short_opt, long_opt, NULL)) != -1) 
    { 
     switch(c) 
     { 
     case -1:  /* no more arguments */ 
     case 0:  /* long options toggles */ 
     break; 

     case 'f': 
     printf("you entered \"%s\"\n", optarg); 
     break; 

     case 'h': 
     printf("Usage: %s [OPTIONS]\n", argv[0]); 
     printf(" -f file     file\n"); 
     printf(" -h, --help    print this help and exit\n"); 
     printf("\n"); 
     return(0); 

     case ':': 
     case '?': 
     fprintf(stderr, "Try `%s --help' for more information.\n", argv[0]); 
     return(-2); 

     default: 
     fprintf(stderr, "%s: invalid option -- %c\n", argv[0], c); 
     fprintf(stderr, "Try `%s --help' for more information.\n", argv[0]); 
     return(-2); 
     }; 
    }; 

    return(0); 
} 
+0

Esiste un limite al numero di argomenti diversi che posso utilizzare per getopt_long()? Ho 17 argomenti diversi e riconosce solo l'argomento quando inserisco la versione del personaggio dell'argomento e non l'argomento lungo. – AndroidDev93

+0

Credo che tu sia limitato dalla memoria. Stai aggiornando l'ultimo valore di long_opts? Nel mio esempio, ogni opzione lunga è abbinata a un'opzione breve. Quindi '--help' e '-h' sono la stessa opzione. Tuttavia, puoi fare in modo che '--help' sia uguale all'opzione '-p' cambiando la 'h' in 'p' e aggiungendo 'p' alla stringa short_opt. –

+1

Ho appena letto le tue modifiche. Devi usare '--option' invece di '-option'. getopt() e getopt_long() interpreteranno '-option' come '-o -p -t -i -o -n'. Se si desidera utilizzare le opzioni lunghe con un trattino singolo, è necessario scrivere il proprio parser di argomenti CLI o provare a trovarne uno esistente che corrisponde al comportamento desiderato. –

Problemi correlati