11
votes

Obtenir un numéro hexadécimal dans un programme via la ligne de commande

Je peux faire ceci: xxx

mais quelle est la bonne façon d'obtenir un numéro hexadécimal dans le programme via la ligne de commande?

non signé Char ctest = argv [1];

ne fait pas l'affaire. Qui produit une initialisation fait entier du pointeur sans avertissement coulé.


4 commentaires

Les arguments de ligne de commande sont Toujours Strings. Certaines plates-formes peuvent les faire unicode, auquel cas un simple strtol ne fonctionnera pas.


@Dircrange: auquel cas mbstol ou quelles que soient les variantes de char (ou de TCHAR) multibytes ou larges couvrant cela? (Je doute également que cela est une préoccupation essentielle compte tenu de la nature de la question


@ Dircrement: Dans ce cas, est le deuxième paramètre de principal () non de type Char ** ? Cela ne peut pas être conforme aux normes.


@Alok: Ils pourraient encore être multi-octets auquel cas Mbstoul serait le mieux, mais c'est beaucoup trop fantaisie dans le contexte de la question


6 Réponses :


7
votes

Vous pouvez utiliser strtoul qui traverserait les personnages de la String et convertissez-les, en tenant compte du RADIX (16 dans ce contexte) que vous passez dans: -

int val;
sscanf(argv[1], &val)
printf("%d\n", val); 


4 commentaires

uchar_max peut être supérieur à celui de long_max , vous devez donc utiliser strtoul () et valeur> 255 doit être < Code> Valeur> Uchar_max . Enfin, static_cast est C ++; Ici, vous n'avez pas besoin d'une distribution à cause des règles de conversion implicites.


Ta, j'ai eu un COUT dans la version intiale: PI considérait à l'aide de vous initialement, mais je pensais que cela compliquerait trop les choses étant donné que le questionneur cherche principalement à comprendre un concept qui ne leur est pas immédiatement évident. .


Je conviens que parfois, il faut faire des choses non entièrement - pédantiquement - corrigées pour les débutants, mais dans ce cas, je pense que le pédantisme n'est pas trop difficile, même pour un débutant. Il empêchera de nombreuses personnes d'assumer que uchar_max == 255 ou long_max> uchar_max , etc., etc., merci pour la modification et une bonne réponse!


@Alok: toujours heureux d'être pédants, merci! Je pense que la fonte est bonne ici car elle explique ce qui se passe dans un lecteur et évitera des avertissements sur la conversion de raccourcissement susceptible d'être allumée. Je laisserai des préoccupations de MBS (et des préoccupations de WCHAR_T lorsque la question les a dirigées). SUR ET OUT!



10
votes

Comme le type de principal code> indique, les arguments de la ligne de commande sont des chaînes et nécessiteront la conversion à différentes représentations.

Conversion d'un argument de ligne de commande unique hexadécimale à apparence décimaux comme p >

$ echo $(perl -e 'print "\x50\x65\x72\x6c"')
Perl
$ echo `python -c 'print "\x50\x79\x74\x68\x6f\x6e"'`
Python


0 commentaires

-3
votes

atoi , atol , stroi , strtol

Tout dans stdlib.h


1 commentaires

Tous ont fait remarquer 3 minutes avant (le voir aussi de la page d'homme liée) mais ne pas aider le questionneur à comprendre pourquoi c'est nécessaire ou donner un échantillon. Quand un message n'est pas ajouté, il est bon de la supprimer pour le garder sec



4
votes
unsigned char cTest = argv[1];
is wrong, because argv[1] is of type char *.  If argv[1] contains something like "0xff" and you want to assign the integer value corresponding to that to an unsigned char, the easiest way would be probably to use strtoul() to first convert it to an unsigned long, and then check to see if the converted value is less than or equal to UCHAR_MAX.  If yes, you can just assign to cTest.strtoul()'s third parameter is a base, which can be 0 to denote C-style number parsing (octal and hexadecimal literals are allowed).  If you only want to allow base 16, pass that as the third argument to strtoul().  If you want to allow any base (so you can parse 0xff, 0377, 255, etc.), use 0.UCHAR_MAX is defined in <limits.h>.

1 commentaires

+1 Bonne explication, prise dans le raisonnement derrière la plupart des points que j'essaie de montrer dans le code



1
votes

La manière traditionnelle de faire ce genre de chose en C est avec scanf () . C'est exactement l'inverse de printf (), lisant le format donné out du fichier (ou terminal) et dans les variables que vous énumérez plutôt que de les écrire.

Dans votre cas, vous utiliseriez sscanf comme vous l'avez déjà eu dans une chaîne plutôt qu'un flux.


0 commentaires

17
votes

Je pense que certaines personnes arrivant ici peuvent simplement rechercher: xxx


2 commentaires

J'étais. Merci beaucoup!


Merci beaucoup - très très utile