L'obtention d'un nombre hexadécimal en un programme via la ligne de commande
Je peux le faire:
int main(int argc, char** argv) {
unsigned char cTest = 0xff;
return 0;
}
Mais quelle est la bonne façon d'obtenir un nombre hexadécimal dans le programme via la ligne de commande?
unsigned char cTest = argv[1];
ne pas faire l'affaire. Qui produit un de l'initialisation de fait de nombre entier à partir de pointeur sans un casting avertissement.
Arguments de ligne de commande sont toujours les chaînes de caractères. Certaines plates-formes peuvent en Unicode, dans ce cas, un simple
auquel cas
dans ce cas, est le deuxième paramètre de
Ils pourraient encore être multi-octets dans lequel cas mbstoul serait le mieux, mais c'est beaucoup trop de fantaisie dans le contexte de la question il me semble
strtol
ne fonctionnera pas.auquel cas
mbstol
ou quel que soit le multi-octets ou large char (ou TCHAR) variantes couvrirait que? (Je doute aussi que c'est une priorité, étant donné la nature de la questiondans ce cas, est le deuxième paramètre de
main()
pas de type char **
? Qui ne peut pas être conformes aux normes en vigueur.Ils pourraient encore être multi-octets dans lequel cas mbstoul serait le mieux, mais c'est beaucoup trop de fantaisie dans le contexte de la question il me semble
OriginalL'auteur Pieter | 2010-01-29
Vous devez vous connecter pour publier un commentaire.
Exemple d'utilisation:
OriginalL'auteur Greg Bacon
Je pense que certaines personnes arriver ici, peut-être à la recherche pour:
Grâce charges - très très utile
OriginalL'auteur Peter Le Bek
Vous pouvez utiliser strtoul qui traverserait les caractères dans la chaîne et de les convertir, en tenant compte de la base (16 dans ce contexte) que vous passez dans:-
Abordés dans les autres exemples, il y a des méthodes plus courtes, mais aucun d'entre eux vous permettent de propreté, de l'erreur, vérifiez le traitement (ce qui arrive si quelqu'un passe
FFF
et vous avez seulement ununsiged char
de le mettre en?par exemple avec
sscanf
:UCHAR_MAX
peut être supérieure àLONG_MAX
, de sorte que vous devriez utiliserstrtoul()
, etvalue > 255
devrait êtrevalue > UCHAR_MAX
. Enfin,static_cast
est le C++; ici, vous n'avez pas besoin d'un plâtre en raison de la conversion implicite des règles.Ta, j'ai eu un
cout
dans la version initiale 😛 j'ai considéré l'utilisation de u au départ, mais la pensée qu'il serait compliquer les choses trop étant donné que l'interlocuteur est principalement à la recherche pour comprendre un concept qui n'est pas immédiatement évident pour eux.Je suis d'accord que parfois on doit faire des choses, pas forcément manière affectée de corriger pour les débutants, mais dans ce cas je pense que la pédanterie n'est pas trop dur, même pour un débutant. Elle permettra d'éviter beaucoup de gens à partir en supposant que
UCHAR_MAX == 255
ouLONG_MAX > UCHAR_MAX
, etc. Merci pour l'edit et une bonne réponse!Toujours heureux d'être pédant, merci! Je pense que le casting est bon, comme il l'explique ce qui se passe à un lecteur et d'éviter des avertissements au sujet du raccourcissement de conversion devraient-ils être allumé. Je vais laisser de côté mbs préoccupations (et wchar_t préoccupations que la question a statué). Plus de et la!
OriginalL'auteur Ruben Bartelink
est faux, parce que
argv[1]
est de typechar *
. Siargv[1]
contient quelque chose comme"0xff"
et que vous souhaitez affecter la valeur de l'entier correspondant à uneunsigned char
, le plus simple serait sans doute d'utiliserstrtoul()
d'abord le convertir en ununsigned long
, puis vérifiez si la valeur convertie est inférieure ou égale àUCHAR_MAX
. Si oui, vous pouvez attribuer àcTest
.strtoul()
troisième paramètre est une base, qui peut être 0 pour désigner C-numéro de modèle d'analyse (octal et hexadécimal littéraux sont autorisées). Si vous souhaitez uniquement pour permettre à la base 16, pass comme troisième argument destrtoul()
. Si vous voulez permettre à tous de base (de sorte que vous pouvez analyser0xff
,0377
,255
, etc.), utiliser 0.UCHAR_MAX
est défini dans<limits.h>
.OriginalL'auteur Alok Singhal
La manière traditionnelle de faire ce genre de chose C est avec scanf(). C'est exactement l'inverse de printf(), la lecture, le format donné hors du fichier (ou terminal) et dans les variables de la liste, plutôt que de les écrire.
Dans votre cas, vous devriez utiliser
sscanf
comme vous l'avez déjà eu dans une chaîne plutôt qu'un ruisseau.OriginalL'auteur T.E.D.
atoi
,atol
,strtoi
,strtol
tous dans
stdlib.h
OriginalL'auteur Pod