C – lettura dei parametri della riga di comando

Ho fatto un piccolo programma per calcolare il PI come un integrale. Ora sto affrontando la domanda su come estenderlo a compute integral, che sarà dato come parametro extra all’avvio e app. Qualcuno sa come affrontare un tale parametro in un programma? Grazie

Quando scrivi la tua funzione principale, di solito hai visto una delle due definizioni:

  • int main(void)
  • int main(int argc, char **argv)

Il secondo modulo ti consentirà di accedere agli argomenti della riga di comando passati al programma e al numero di argomenti specificati (gli argomenti sono separati da spazi).

Gli argomenti main sono:

  • int argc : il numero di argomenti passati al tuo programma quando è stato eseguito. È almeno 1 .
  • char **argv – questo è un puntatore a char * . In alternativa può essere questo: char *argv[] , che significa ‘array of char * ‘. Questa è una matrice di puntatori a stringa in stile C.

Esempio di base

Ad esempio, puoi farlo per stampare gli argomenti passati al tuo programma C:

 #include  int main(int argc, char **argv) { for (int i = 0; i < argc; ++i) { printf("argv[%d]: %s\n", i, argv[i]); } } 

Sto usando GCC 4.5 per compilare questo, è un file che ho chiamato args.c Compilerà e costruirà un eseguibile a.out predefinito.

 [[email protected] c_code]$ gcc -std=c99 args.c 

Ora eseguilo ...

 [[email protected] c_code]$ ./a.out hello there argv[0]: ./a.out argv[1]: hello argv[2]: there 

Quindi puoi vedere che in argv , argv[0] è il nome del programma che hai eseguito (questo non è un comportamento definito dagli standard, ma è comune. Gli argomenti partono da argv[1] e oltre.

Quindi, in sostanza, se volessi un singolo parametro, potresti dire ...

./myprogram integral


Un semplice caso per te

E si potrebbe verificare se argv[1] fosse integral , magari come strcmp("integral", argv[1]) == 0 .

Quindi nel tuo codice ...

 #include  #include  int main(int argc, char **argv) { if (argc < 2) // no arguments were passed { // do something } if (strcmp("integral", argv[1]) == 0) { runIntegral(...); //or something } else { // do something else. } } 

Migliore analisi della riga di comando

Naturalmente, tutto ciò era molto rudimentale e, dato che il programma diventa più complesso, è probabile che si desideri una gestione più avanzata della riga di comando. Per quello, potresti usare una libreria come GNU getopt .

L’analisi degli argomenti della riga di comando in modo primitivo, come spiegato nelle risposte precedenti, è ragionevole a condizione che il numero di parametri da trattare non sia eccessivo.

Vi consiglio caldamente di usare una libreria di forza industriale per gestire gli argomenti della riga di comando.

Questo renderà il tuo codice più professionale.

Tale libreria per C ++ è disponibile nel seguente sito Web. Ho usato questa libreria in molti dei miei progetti, quindi posso tranquillamente dire che questa è una delle librerie più semplici ma utili per l’analisi della riga di comando. Inoltre, poiché è solo una libreria di template, è più facile importare nel tuo progetto. http://tclap.sourceforge.net/

Una libreria simile è disponibile anche per C. http://argtable.sourceforge.net/

 #include  #include  int main(int argc, char **argv) { int i, parameter = 0; if (argc >= 2) { /* there is 1 parameter (or more) in the command line used */ /* argv[0] may point to the program name */ /* argv[1] points to the 1st parameter */ /* argv[argc] is NULL */ parameter = atoi(argv[1]); /* better to use strtol */ if (parameter > 0) { for (i = 0; i < parameter; i++) printf("%d ", i); } else { fprintf(stderr, "Please use a positive integer.\n"); } } return 0; } 

C’è anche una libreria incorporata standard C per ottenere argomenti da linea di comando: getopt

Puoi verificarlo su https://en.wikipedia.org/wiki/Getopt o aiutanti di analisi di argomenti per C / UNIX