scanf kann nicht Scannen, in uint8_t
Wenn ich versuche, mit scanf
mit uint8_t
bekomme ich verrückte Ergebnisse.
Mit int
, ich bekomme die erwartete Ausgabe "08 - 15".
Mit uint8_t
, bekomme ich "00 - 15".
const char *foo = "0815";
uint8_t d1, d2; //output: 00 - 15 (!!!)
//int d1, d2; //output: 08 - 15
sscanf(foo, "%2d %2d", &d1, &d2);
printf("%02d - %02d\n", d1, d2);
Bin ich mit GCC.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
%d
ist falsch, weil es bedeutet, dass Sie auf der Durchreise sindint *
aber Sie wirklich wollen, um passuint8_t *
. Sie müssen verwenden Sie das entsprechende makro:Meisten Compiler geben sollte Sie Warnungen über Ihre version des Codes. Hier ist Ertönt Ausgabe:
Für
uint8_t
dies gilt nicht fürprintf()
, da dieuint8_t
immer gefördert werden, umint
bevor es übergeben wird, umprintf()
.printf
undva_args
kann es "einfach so" funktionieren oder scheitern kann.int
befördert zuint
wenn übergeben variadischen Funktionen. Dieuint8_t
Typ range ist garantiert auch ein Teil der Bandbreite fürint
, so ist dies garantiert immer richtig.<inttypes.h>
und beachten Sie, dassPRIi8
ist genau das gleiche alsPRIi32
.unsigned char
und das Vertrauen, dassunsigned char
ist immer eine 8-bit-Zahl. Dies ist eine ziemlich gute Annahme für die meisten Menschen.uint8_t
existiert, muss es ein typedef fürunsigned char
(oder, pathologisch, für ein Typ mit der selben Größe und Darstellung alsunsigned char
.) Es ist nicht möglich, mit kleineren Typen alschar
, dasizeof(char) == 1
.uint8_t
existiert nicht, z.B.CHAR_BIT == 32
oder so etwas. Sie können immerstatic int check[CHAR_BIT == 8 ? 1 : -1];
zu überprüfen, wenn.uint8_t d1, d2;
würde nicht kompilieren.unsigned char
es kompiliert, aber das Verhalten kann falsch sein. Daher die Warnung, "das ist eine ziemlich gute Annahme für die meisten Menschen".%hhu
mituint8_t
zu vermeiden, die "Hässlichkeit" des fixed-width-specifier-Makros.SCNu8
ist fast immer#define
d als%hhu
- so, es sei denn, Sie sind mit einigen wahnsinnig seltene Plattform, ich würde sagen, der Unterschied ist nicht groß - vor allem, weil sollten Sie nicht verwendenscanf
sowieso...Der scanf-format-Bezeichner
%d
sagt "ich verspreche Ihnen eineint *
". Sie brechen das Versprechen nicht liefert die Adresse einesint
. Sind alle Wetten ab. (Es ist Undefiniertes Verhalten.)Moral: Don ' T lie zu Ihrem compiler.
Dein code funktioniert nicht, weil Sie sagen, scanf() erwartet einen Zeiger auf eine 4-byte-Datentyp (int), wenn uint8_t ist nur ein byte.