Analyser correctement arguments de ligne de commande en C
Ce que je suis en train de faire est de prendre dans les arguments de ligne de commande et de modifier certaines variables en fonction des arguments. J'ai attaché un morceau de mon code parce que l'ensemble du code est de ~400 lignes.
#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 d'utilisateur:
./foobar -f rouge c'est une chaîne
le programme doit d'impression:
"ce sera imprimée en rouge c'est une chaîne"
Si les entrées d'utilisateur:
./foobar -f rouge
le programme devrait print "nombre incorrect d'arguments de ligne de commande".
Quelle est la meilleure façon de le faire? J'ai essayé des tonnes de possibilités avec pas de chance.
Nombre variable d'arguments est le principal problème pour moi (d'ailleurs j'ai plus de 5 options d'e.g..-f -b -h -w -e)
De l'aide serait très appréciée. Je peux ajouter mon code entier si vous le souhaitez.
- si vous ne mettez pas le texte "ceci est une chaîne" entre guillemets le programme va interpréter chaque mot comme un seul argument
- Regarder #include <argp.h> crasseux.com/books/ctutorial/argp-example.html aussi stackoverflow.com/questions/7677562/...
Vous devez vous connecter pour publier un commentaire.
Via ce lien, vous trouverez une description de la façon de le faire facilement le plein soutien de paramètres de ligne de commande:
http://www.gnu.org/s/hello/manual/libc/Getopt.html
X
, comme indiqué ici: http://..." peut être considéré comme une bonne réponse.La bonne façon est d'utiliser l'un des nombreux analyseur de bibliothèques au lieu d'analyser manuellement vous-même. Il est plus facile, plus puissant, et vous évite de réinventer la roue.
GNU
libc
manuel suggère un peu de bibliothèques, en fonction de la façon de fantaisie/standard que vous souhaitez être:http://www.gnu.org/software/libc/manual/html_node/Parsing-Program-Arguments.html
getopt
: comme mentionné par une autre réponseargp
: mon choix habituelsuboptions
: pour des solutions complexesChangement int ca= 0 d'int ca= 1
Parce que argv[0] est le nom de votre exécutable
Les choses vont devenir beaucoup plus clair si vous utilisez une boucle for à la place de la bête "d'autre alors que la" construction: