Immer eine hexadezimale Zahl in ein Programm über die Kommandozeile
Kann ich dies tun:
int main(int argc, char** argv) {
unsigned char cTest = 0xff;
return 0;
}
Aber was ist der richtige Weg, um eine hexadezimale Zahl in das Programm über die Kommandozeile?
unsigned char cTest = argv[1];
nicht den trick tun. Das erzeugt eine Initialisierung macht Ganzzahl von Zeiger ohne cast Warnung.
- Befehl Linie Argumente sind immer - strings. Einige Plattformen machen Sie zu Unicode, in dem Fall eine einfache
strtol
wird nicht funktionieren. - in dem Fall
mbstol
oder was auch immer die multibyte or wide char (oder TCHAR) Varianten abdecken würde, dass? (Ich habe auch Zweifel, dies ist ein wichtiges Anliegen, angesichts der Natur der Frage - in diesem Fall ist der zweite parameter von
main()
nicht der Typchar **
? Das kann man nicht Normen-konform. - Sie konnte immer noch werden multi-byte in dem Fall mbstoul wäre am besten, aber das ist viel zu viel Phantasie in den Kontext der Frage dünkt mich
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beispiel:
Ich denke, einige Leute, die hier ankommen könnte nur sein, auf der Suche nach:
Könnten Sie strtoul würde Spaziergang durch die Zeichen in der Zeichenfolge, und konvertieren Sie Sie, unter Berücksichtigung der radix (16 in diesem Kontext), die Sie übergeben:-
Wie in den anderen Beispielen, es gibt kürzere Wege, aber keiner von Ihnen erlauben, Sie sauber zu Fehler überprüfen Sie die Verarbeitung (was passiert, wenn jemand vorbeigeht
FFF
und du hast nur eineunsiged char
steckte es in?z.B. mit
sscanf
:UCHAR_MAX
kann größer sein alsLONG_MAX
, so dass Sie verwenden solltenstrtoul()
, undvalue > 255
solltevalue > UCHAR_MAX
. Schließlichstatic_cast
ist C++; hier brauchen Sie nicht eine Besetzung, da der implizite Konvertierung Regeln.cout
in der es in der ersten version 😛 ich als mithilfe von u anfangs aber dachte, es wäre komplizierter wird die Sache zu viel gegeben, dass der Fragesteller vor allem auf der Suche zu verstehen, ein Konzept, dass nicht sofort offensichtlich zu Ihnen.UCHAR_MAX == 255
oderLONG_MAX > UCHAR_MAX
usw. Vielen Dank für die edit-und eine gute Antwort!ist falsch, weil
argv[1]
ist der Typchar *
. Wennargv[1]
enthält so etwas wie"0xff"
und Sie möchten, zuweisen der ganzzahligen Wert entsprechend, um eineunsigned char
am einfachsten wäre wohl die Verwendungstrtoul()
zuerst konvertieren es in einunsigned long
, und dann überprüfen, um zu sehen, wenn der umgewandelte Wert weniger als oder gleichUCHAR_MAX
. Wenn ja, können Sie einfach zuweisencTest
.strtoul()
's Dritte parameter ist eine Basis, die 0 zu bezeichnen, C-Format Nummer Parsen (oktale und hexadezimale Literale sind erlaubt). Wenn Sie nur wollen, zu ermöglichen, Basis 16, passieren, dass als drittes argumentstrtoul()
. Wenn Sie möchten, dass alle base (so können Sie analysieren0xff
,0377
,255
usw.), verwenden Sie 0.UCHAR_MAX
definiert ist, in<limits.h>
.Den traditionellen Weg, das zu tun diese Art der Sache in C ist mit scanf(). Es ist genau die inverse von printf(), das Lesen von dem angegebenen format aus der Datei (oder terminal) und in der Variablen Liste, sondern schreiben Sie in ihn.
In Ihrem Fall, die Sie verwenden würden
sscanf
wie Sie bereits habe es in einen string anstatt einem stream.atoi
,atol
,strtoi
,strtol
alle in
stdlib.h