Je sais que je peux simplement utiliser GetOPT ou une autre bibliothèque pour ce produit, mais je réinvente la roue. Je ne veux pas simplement m'asseoir ici et penser que "Opt opt viens d'analyser automatiquement l'option pour vous".
Voici ce que j'ai créé: P>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct option_properties
{
char *arglong;
int tag;
};
int main(int argc, char **argv){
struct option_properties options[] =
{
{"--input", 0},
{"--output", 1},
{"NULL", 2}
};
int i;
int flag;
int k = 1;
for (; k < argc; k++){ //part 0
printf("%d\n", k);
for (i = 0; i < 3; i++){ // part 1
if (!strcmp(argv[k], options[i].arglong)){ // part 2
switch (options[i].tag) //part 3
{
case 0:
printf("argument input: %s\n", argv[k+1]);
break;
case 1:
printf("argument output: %s\n", argv[k+1]);
break;
default:
break;
}
break;
}
}
}
}
4 Réponses :
Avant votre Après la boucle, vérifiez la valeur de pour code> en boucle sur Options CODE>, définissez une version Boolean Variabele trouvée code> sur false code>. Lorsque vous trouvez une correspondance, définissez-la sur true code>. P>
trouvé code>. Si c'est faux code> Imprimez une sorte de message d'erreur. P>
Ne pensez-t-il pas aussi qu'un argument suivi de l'option (ex -input bonjour. Bonjour est l'ARG) est également une option invalide?
@hareamjari Vous devez traiter les arguments d'option à l'intérieur de la boucle, probablement dans votre relevé code> code>. Si une option a un argument, vous devez augmenter manuellement k code>.
Voici quelques suggestions: P>
Tailleof (Options) / Tiazof (Struct option_properties) Code> au lieu de 3 code>. Li>
- en utilisant
Tailleof () code>, vous pouvez faire sans {"null", 2} code>. li>.
- déplacer
int k = 1 code> INTER pour () code>: pour (int k = 1; k code>. li>
- Je vous conseille vivement d'arrêter d'utiliser des caractères d'onglets pour indenter votre code. Changez vos paramètres d'éditeur sur les insertions d'onglets-4-espaces. Li>
ul>
Pour vérifier si une option est invalide, vous pouvez ajouter un int trouvé = 0 code> variable que vous définissez sur 1 code> si ! STRCMP (argv [k ], options [i] .arglong) code> est vrai. Et vous vérifiez trouvé code> après le pour (i = 0; i <3; i ++) code> boucle. P>
La question devrait plutôt être une option valide. Les personnes venant de Windows ont souvent une attente complètement différente de la façon dont les paramètres ressemblent, par ex. commencer par une barre oblique à la place un moins. Ce qui est valable, c'est donc complètement dépendant complètement et d'être considéré comme une fonctionnalité de convivialité, si vous le résolvez à une manière courante.
Je pense que vous avez déjà dans votre programme le chemin de code des options non valides. C'est le Mais je considérerais une solution plate encore plus simple. J'ai écrit tel et il itère sur un pointeur de char. Regardez à quel point c'est: p> Par défaut: code> dans votre relevé de commutateur. Mais ce que je n'aime pas sur votre code, c'est que vous utilisez Numéros magiques , que vous avez défini dans
struct option_properties code>. L'inconvénient est que vous devez vous rappeler le mappage entre l'option et un numéro, qui est sujette d'erreur, en particulier avec plus d'options. Vous pouvez améliorer cela en utilisant un Enum code> au lieu d'avoir des noms significatifs pour votre case code>. P>
Alors je le résolve moi-même:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct option_properties
{
char *arglong;
int tag;
};
int main(int argc, char **argv){
struct option_properties options[] =
{
{"--input", 0},
{"--output", 1},
{"NULL", 2}
};
enum {
input = 0,
output = 1
};
printf("%d\n", argc);
int i;
int flag;
int k = 1;
for (; k < argc; ){
for (i = 0; i < 3; i++){
if (!strcmp(argv[k], options[i].arglong)){
switch (options[i].tag)
{
case input:
printf("argument input: %s\n", argv[k+1]);
break;
case output:
printf("argument output: %s\n", argv[k+1]);
break;
default:
printf("unk %s\n", argv[k]);
exit(1);
}
printf("1\n");
k += 2;
break;
}
else {
if (i == 2) {
printf("Ooooops: %s %d", argv[k], k);
exit(1);
}
}
}
}
}
Vous pouvez améliorer encore ce code en réorganisant l'ENUM et STRT, puis utilisez également les valeurs ENUM Entrée code> et sortie code> dans la structure. Cela éliminerait complètement les nombres magiques. De plus, de nombreuses normes de style de codage rédigeraient des valeurs ENUM en majuscules et avec un préfixe, par ex. utilisateurs.ece.cmu.edu/~eno/coding/ccodingStandard. HTML # Endame
Essayez-vous de réinventer la roue juste pour le plaisir / l'apprentissage ou existe-t-il une fonctionnalité dans GetOpt qui vous manque?
@klutt GetOpt est bon, je veux juste apprendre à créer un analyseur arg. En faisant, je sais ce que ça fait et je peux le modifier pour mes préférences.
Comment savez-vous que cela ne détecte pas une option invalide? Essayez GDB, c'est assez petit code de déboguer et vous pouvez le faire en quelques minutes.
Je ne peux pas voir un
printf code> pour une option non valide!