Question

J'ai lu un exemple getopt () mais il ne montre pas comment accepter les entiers comme des options d'argument, 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 je courais le haut comme testop -c foo, cvalue serait foo, mais si je voulais testop -c 42? Depuis cvalue est de type char *, pourrais-je jetai optarg être (int)? Je l'ai essayé de faire cela sans l'aide et l'accès getopt() argv[whatever] directement, et le jeter comme un entier, mais je finis toujours avec un grand nombre de négatif lors de l'impression avec %d. Je suppose que je ne suis pas déréférencement argv[] correctement ou quelque chose, pas sûr ...

Était-ce utile?

La solution

Vous devez utiliser atoi() pour convertir de chaîne en entier.

Autres conseils

Toutes les réponses ci-dessus sont largement correct (Vikram.exe obtient des accessoires pour expliquer pourquoi vous devez appeler une fonction bibliothèque, personne d'autre pris la peine de le faire). Cependant, personne n'a appelé correct fonction de bibliothèque pour appeler. Ne pas utiliser atoi. Ne pas utiliser sscanf.

Utilisez strtol , ou son parent strtoul si vous ne voulez pas que les nombres négatifs. Seules ces fonctions vous donnent suffisamment d'informations lorsque l'entrée était pas un numéro. Par exemple, si l'utilisateur tape

./a.out 123cheesesandwich

atoi et sscanf retourneront joyeusement 123, ce qui est presque certainement pas ce que vous voulez. Seulement strtol vous dira (via le endptr) qu'il a traité seulement les premiers caractères de la chaîne.

(Il n'y a pas strtoi, mais il est strtod si vous avez besoin de lire un nombre à virgule flottante.)

Comme vous l'avez déjà utilisé dans votre code, le prototype pour la fonction main est

int main (int argc, char** argv)

Quel que des arguments sont fournis à titre d'arguments de ligne de commande, ils sont passés à votre « programme » comme un tableau de char * (ou simplement des chaînes). donc si vous invoquez un prog comme 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 caster l'argument à l'entier (comme vous le dites) en utilisant probablement quelque chose comme: (int) argv[1], vous ne serez pas obtenir la valeur entière de premier argument, mais une adresse mémoire où est stockée la première arg dans l'espace d'adressage. Pour obtenir une valeur entière, vous devez convertir explicitement la valeur de chaîne à valeur entière. Pour cela, vous pouvez utiliser la fonction atoi. Consultez page de manuel de ce pour des fonctions similaires qui peuvent être utilisés pour la conversion.

Utilisez atoi.

cvalue = atoi( optarg );

Et cvalue annoncez comme int.

atoi(), ce qui signifie ascii à nombre entier est la fonction à utiliser. De même, atof() peut être utilisé pour obtenir des valeurs flottantes.

Dans cette situation, je pencherais pour un sscanf().

Non, vous ne pouvez pas simplement jeter pour le convertir en une valeur entière. Vous devez la transformer en utilisant sscanf, atoi, atol ou fonction similaire.

scroll top