Je peux faire ceci: mais quelle est la bonne façon d'obtenir un numéro hexadécimal dans le programme via la ligne de commande? P> ne fait pas l'affaire. Qui produit une initialisation fait entier du pointeur sans avertissement em> coulé. P> p> non signé Char ctest = argv [1]; code> p>
6 Réponses :
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);
uchar_max code> peut être supérieur à celui de
long_max code>, vous devez donc utiliser
strtoul () code> et
valeur> 255 code> doit être < Code> Valeur> Uchar_max code>. Enfin,
static_cast code> est C ++; Ici, vous n'avez pas besoin d'une distribution à cause des règles de conversion implicites.
Ta, j'ai eu un COUT CODE> 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 code> ou
long_max> uchar_max code>, 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!
Comme le type de Conversion d'un argument de ligne de commande unique hexadécimale à apparence décimaux comme p > principal code> indique, les arguments de la ligne de commande sont des chaînes et nécessiteront la conversion à différentes représentations.
$ echo $(perl -e 'print "\x50\x65\x72\x6c"')
Perl
$ echo `python -c 'print "\x50\x79\x74\x68\x6f\x6e"'`
Python
Tout dans atoi code>,
atol code>,
stroi code>,
strtol code> p> p>
stdlib.h code> p>
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
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 Bonne explication, prise dans le raisonnement derrière la plupart des points que j'essaie de montrer dans le code
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 em> du fichier (ou terminal) et dans les variables que vous énumérez plutôt que de les écrire. P>
Dans votre cas, vous utiliseriez sscanf code> comme vous l'avez déjà eu dans une chaîne plutôt qu'un flux. P>
Je pense que certaines personnes arrivant ici peuvent simplement rechercher:
J'étais. Merci beaucoup!
Merci beaucoup - très très utile
Les arguments de ligne de commande sont Toujours B> Strings. Certaines plates-formes peuvent les faire unicode, auquel cas un simple
strtol code> ne fonctionnera pas.
@Dircrange: auquel cas
mbstol code> 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 () code> non de type
Char ** code>? 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