comment prendre des entiers comme arguments de ligne de commande?

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.