J’ai lu un exemple avec getopt () mais il ne montre pas comment accepter les entiers comme options d’argument, comme cvalue
serait dans le code de l’exemple
#include #include #include #include int main (int argc, char **argv) { int aflag = 0; int bflag = 0; char *cvalue = NULL; int index; int c; opterr = 0; while ((c = getopt (argc, argv, "abc:")) != -1) switch (c) { case 'a': aflag = 1; break; case 'b': bflag = 1; break; case 'c': cvalue = optarg; break; case '?': if (optopt == 'c') fprintf (stderr, "Option -%c requires an argument.\n", optopt); else if (isprint (optopt)) fprintf (stderr, "Unknown option `-%c'.\n", optopt); else fprintf (stderr, "Unknown option character `\\x%x'.\n", optopt); return 1; default: abort (); } printf ("aflag = %d, bflag = %d, cvalue = %s\n", aflag, bflag, cvalue); for (index = optind; index < argc; index++) printf ("Non-option argument %s\n", argv[index]); return 0; }
Si testop -c foo
ce qui précède comme testop -c foo
, cvalue
serait foo
, mais si je voulais testop -c 42
? Puisque cvalue
est de type char *
, pourrais-je simplement optarg
en tant que (int)
? J’ai essayé de le faire sans utiliser getopt()
et d’accéder directement à argv[whatever]
, et de le getopt()
en tant getopt()
, mais je getopt()
toujours avec un grand nombre négatif lors de l’impression avec %d
. Je suppose que je ne déréférence pas correctement argv[]
ou quelque chose, pas sûr …
Vous devez utiliser atoi()
pour convertir de chaîne en entier.
Toutes les réponses ci-dessus sont globalement correctes (Vikram.exe obtient des accessoires pour expliquer pourquoi vous devez appeler une fonction de bibliothèque, ce que personne d’autre n’a pris la peine de faire). Cependant, personne n’a nommé la fonction de bibliothèque correcte à appeler. Ne pas utiliser atoi
. Ne pas utiliser sscanf
.
Utilisez strtol
, ou son strtoul
relatif si vous ne voulez pas autoriser les nombres négatifs. Seules ces fonctions vous fournissent suffisamment d’informations lorsque l’entrée n’était pas un nombre. Par exemple, si l’utilisateur tape
./a.out 123cheesesandwich
atoi
et sscanf
vont revenir avec joie 123, ce qui n’est certainement pas ce que vous voulez. Seul strtol
vous dira (via endptr
) qu’il n’a traité que les premiers caractères de la chaîne.
(Il n’y a pas de strtoi
, mais il y en strtod
si vous avez besoin de lire un nombre à virgule flottante.)
Comme vous l’avez déjà utilisé dans votre code, le prototype de main
fonction main
est
int main (int argc, char** argv)
Quels que soient les arguments fournis en tant qu’arguments de ligne de commande, ils sont transmis à votre ‘programme’ sous la forme d’un tableau de caractères char * (ou simplement de chaînes). Par conséquent, si vous foo.exe 123
un prog sous le nom foo.exe 123
, le premier argument de foo.exe
sera une chaîne 123 et non une valeur entière de 123.
Si vous essayez de transformer l’argument en entier (comme vous l’avez dit) en utilisant probablement quelque chose comme: (int) argv[1]
, vous n’obtiendrez pas la valeur entière du premier argument, mais une adresse mémoire où le premier argument est stocké dans votre espace d’adressage. Pour obtenir une valeur entière, vous devez convertir explicitement la valeur de chaîne en valeur entière. Pour cela, vous pouvez utiliser la fonction atoi
. Consultez la page de manuel THIS pour des fonctions similaires pouvant être utilisées pour la conversion.
Utilisez atoi
.
cvalue = atoi( optarg );
Et déclarer cvalue en tant qu’int.
atoi()
, qui signifie ascii en entier est la fonction à utiliser. De même, atof()
peut être utilisé pour obtenir des valeurs float.
Dans cette situation, je choisirais un sscanf()
.
Non, vous ne pouvez pas simplement convertir pour le convertir en une valeur entière. Vous devez le transformer en utilisant sscanf, atoi, atol ou une fonction similaire.