comment prendre entiers comme des arguments de ligne de commande?
J'ai lu un getopt() exemple mais il ne montre pas comment accepter entiers en argument options, comme cvalue
serait dans le code de l'exemple:
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
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 j'ai couru à la ci-dessus comme testop -c foo
, cvalue
serait foo
, mais que si je voulais testop -c 42
? Depuis cvalue
est de type char *
, pourrais-je les jeter optarg
être (int)
? J'ai essayé de faire cela sans l'aide de getopt()
et l'accès argv[whatever]
directement, et le jetant comme un entier, mais je finis toujours avec un grand nombre négatif lors de l'impression avec %d
. Je suppose que je ne suis pas un déréférencement argv[]
correctement ou quelque chose, pas sûr...
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser
atoi()
pour convertir la chaîne en entier.Toutes les réponses ci-dessus sont largement correct (Vikram.exe reçoit des accessoires pour expliquer pourquoi vous devez appeler une fonction de la bibliothèque, que personne d'autre ne pris la peine de faire). Cependant, personne n'a nommé le corriger de la bibliothèque de la fonction à appeler. Ne pas utiliser
atoi
. Ne pas utilisersscanf
.Utilisation
strtol
, ou sa relativestrtoul
si vous ne souhaitez pas autoriser les nombres négatifs. Seulement ces fonctions vous donner assez d'informations lorsque l'entrée a été pas un certain nombre. Par exemple, si l'utilisateur tapeatoi
etsscanf
joyeusement en retour 123, ce qui est presque certainement pas ce que vous voulez. Seulementstrtol
vous dira (via leendptr
) qu'il a traitées seulement les premiers caractères de la chaîne.(Il n'y a pas de
strtoi
, mais il eststrtod
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 estint main (int argc, char** argv)
Ce que jamais les arguments sont fournis à titre d'arguments de ligne de commande, ils sont passés à votre "programme" comme un tableau de char * (ou tout simplement des chaînes de caractères). donc, si vous appelez un prog comme
foo.exe 123
, le premier argument defoo.exe
sera une chaîne 123 et non pas une valeur entière de 123.Si vous lancez l'argument de type entier (comme vous l'avez dit) probablement en utilisant quelque chose comme:
(int) argv[1]
, vous n'obtiendrez pas l'entier de la valeur du premier argument, mais certains d'adresse mémoire où le premier argument est stocké dans votre espace d'adressage. Pour obtenir une valeur entière, vous devez convertir explicitement de la chaîne de valeur de valeur de type entier. Pour cela, vous pouvez utiliseratoi
fonction. Vérifier CETTE page de man pour des fonctions similaires qui peuvent être utilisés pour la conversion.Utilisation
atoi
.Et déclarer cvalue comme un
int
.atoi()
, ce qui signifie ascii à l'entier est la fonction à utiliser. De même,atof()
peut être utilisée pour obtenir les valeurs flottantes.Dans cette situation, je pencherais pour un
sscanf()
.Non, vous ne pouvez pas les jeter à la convertir en une valeur entière. Vous avez besoin de la transformer à l'aide de sscanf, atoi, atol ou fonction similaire.