2011-12-04 2 views
1

Ce que j'essaie de faire est de prendre en arguments de ligne de commande et de modifier certaines variables en fonction des arguments. J'ai attaché un morceau de mon code parce que le code entier est ~ 400 lignes.Analyser correctement les arguments de ligne de commande dans C

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
int main(int argc, char *argv[]) { 

    char somestring[500]; 
    int ca=0; 
    if (argc==1) //if no arguments are specified use defaults 
    { 
    } 
    else 
    { 
     while(ca<argc) 
     { 
       ca++ 
      if(strcmp(argv[ca],"-f")==0) 
      { 
       printf("This works"); 
       ca++; 
       if(strcmp(argv[ca],"red")==0){ 
        printf("this will print red\n"); 
       } 
       else{ 
        printf("invalid color"); 
       } 
      } 
      if(strcmp(argv[ca),"")==0) 
      { 
       printf("invalid argument"); 
      } 
      else { 
       strcat(somestring,argv[ca]); 
      } 
     } 
     printf("%s",somestring); 
    } 
} 

Si les entrées utilisateur:

./foobar rouge -f ceci est une chaîne

le programme devrait imprimer:

« ce imprimera rouge c'est une chaîne "

Si les entrées utilisateur:

./foobar rouge -f

le programme devrait imprimer "nombre invalide d'arguments de ligne de commande".

Quelle est la manière la plus simple de le faire? J'ai essayé des tonnes de possibilités sans aucune chance. Varier le nombre d'arguments est le principal problème pour moi (aussi j'ai plus de 5 options, par exemple, -f -b -h -w -e)

Aide grandement apprécié. Je peux ajouter tout mon code si vous voulez.

+1

si vous ne mettez pas le texte "ceci est un stri ng "entre guillemets le programme interprétera chaque mot comme un seul argument –

+0

Jetez un oeil à #include http://www.crasseux.com/books/ctutorial/argp-example.html aussi http://stackoverflow.com/questions/7677562/whats-the-difference-between-argp-and-getopt –

Répondre

0

changement int ca = 0 int ca = 1

Parce que argv [0] est le nom de l'exécutable

+0

désolé, je n'ai pas copié le code correctement à partir de mon fichier c, vérifiez-le maintenant. Merci. –

5

Via ce lien, vous trouverez une description de la façon de faire facilement la ligne de commande de prise en charge complète paramètres:

http://www.gnu.org/s/hello/manual/libc/Getopt.html

+0

Génial! Merci beaucoup ! –

+0

Ce n'est pas une bonne réponse. Ajoutez quelques informations ici + ce lien. Voir [Les réponses qui contiennent juste des liens ailleurs sont-elles vraiment de "bonnes réponses"?] (Http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers/8259 # 8259) –

+0

Ok, je comprends, édité – Nips

0

les choses vont beaucoup plus clair si vous utilisez une boucle for au lieu de la bête « autre pendant » construction:

for(ca=1; ca < argc ; ca++) 
    { 
     if(!strcmp(argv[ca],"-f")) 
     { 
     printf("This works"); 
     ca++; /* need to test if ca can be incremented */ 
     if(!strcmp(argv[ca],"red")){ 
      printf("this will print red\n"); 
     } 
     else{ 
      printf("invalid color"); 
     } 
     } 
     else if(!strcmp(argv[ca],"")) 
     { 
     printf("invalid argument"); 
     } 
     else{ 
      strcat(somestring,argv[ca]); 
     } 
    } 
    printf("%s",somestring); 
1
char somestring[500]="";//need initialize 

    while(++ca<argc){//increment before condition test 
     if(strcmp(argv[ca],"-f")==0){ 

      if(ca < argc && strcmp(argv[ca],"red")==0){//need ca check 

     if(ca == argc){//bad strcmp(argv[ca],"") 
      printf("invalid argument"); 
1

La méthode correcte consiste à utiliser l'une des nombreuses bibliothèques d'analyseurs existantes au lieu de vous analyser manuellement. C'est plus facile, plus puissant et vous évite de réinventer la roue.

GNU libc manuel propose quelques bibliothèques, selon la fantaisie/standard, vous voulez être: http://www.gnu.org/software/libc/manual/html_node/Parsing-Program-Arguments.html

  • getopt: comme l'a mentionné une autre réponse
  • argp: mon choix habituel
  • suboptions : pour les solutions complexes
Questions connexes