Ich versuche, einen uint16_t- und einen uint32_t-Wert zu drucken, aber es gibt nicht die gewünschte Ausgabe.
#include <stdio.h>
#include <netinet/in.h>
int main()
{
uint32_t a = 12, a1;
uint16_t b = 1, b1;
a1 = htonl(a);
printf("%d---------%d", a1);
b1 = htons(b);
printf("\n%d-----%d", b, b1);
return 0;
}
habe ich auch benutzt
printf("%"PRIu32, a);
die einen Fehler anzeigt.
Wie drucke ich diese Werte und was wird die gewünschte Ausgabe sein?
Sie müssen einschließen inttypes.h
wenn Sie all diese raffinierten neuen Formatbezeichner für die intN_t
Typen und ihre Brüder, und das ist der richtige (dh portable) Weg, dies zu tun, vorausgesetzt, Ihr Compiler entspricht C99. Sie sollten nicht die Standardtypen wie verwenden %d
oder %u
falls die Größen anders sind als Sie denken.
Es enthält stdint.h
und erweitert es um einige andere Dinge, wie zum Beispiel die Makros, die für die verwendet werden können printf/scanf
Familie der Anrufe. Dies wird in Abschnitt 7.8 des ISO C99-Standards behandelt.
Zum Beispiel das folgende Programm:
#include <stdio.h>
#include <inttypes.h>
int main (void) {
uint32_t a=1234;
uint16_t b=5678;
printf("%" PRIu32 "\n",a);
printf("%" PRIu16 "\n",b);
return 0;
}
Ausgänge:
1234
5678
Die Makros definiert in <inttypes.h>
sind die korrekteste Art, Werte von Typen zu drucken uint32_t
, uint16_t
und so weiter – aber sie sind nicht der einzige Weg.
Ich persönlich finde diese Makros schwer zu merken und umständlich zu verwenden. (Angesichts der Syntax von a printf
Format-String, das ist wahrscheinlich unvermeidlich; Ich behaupte nicht, dass ich mir ein besseres System hätte einfallen lassen können.)
Eine Alternative besteht darin, die Werte in einen vordefinierten Typ umzuwandeln und das Format für diesen Typ zu verwenden.
Typen int
und unsigned int
wird von der Sprache garantiert, dass sie mindestens 16 Bit breit sind und daher jeden konvertierten Wert des Typs aufnehmen können int16_t
oder uint16_t
, beziehungsweise. Ähnlich, long
und unsigned long
mindestens 32 Bit breit sind, und long long
und unsigned long long
mindestens 64 Bit breit sind.
Zum Beispiel könnte ich Ihr Programm so schreiben (mit ein paar zusätzlichen Optimierungen):
#include <stdio.h>
#include <stdint.h>
#include <netinet/in.h>
int main(void)
{
uint32_t a=12, a1;
uint16_t b=1, b1;
a1 = htonl(a);
printf("%lu---------%lu\n", (unsigned long)a, (unsigned long)a1);
b1 = htons(b);
printf("%u-----%u\n", (unsigned)b, (unsigned)b1);
return 0;
}
Ein Vorteil dieses Ansatzes besteht darin, dass er sogar mit Pre-C99-Implementierungen funktionieren kann, die dies nicht unterstützen <inttypes.h>
. Eine solche Implementierung hätte es höchstwahrscheinlich nicht gegeben <stdint.h>
auch nicht, aber die Technik ist für andere Integer-Typen nützlich.
Es wäre viel hilfreicher, uns die (genaue!) Fehlermeldung zu zeigen, anstatt nur zu sagen, dass es “Fehler anzeigt”. Und anstatt nur “das gewünschte o / p nicht zu geben”, zeigen Sie uns die tatsächliche Ausgabe (und buchstabieren Sie das Wort “output”, anstatt “o / p” zu schreiben).
– Keith Thompson
25. August 2012 um 8:59 Uhr
printf("%d---------%d",a1);
führt zu undefiniertem Verhalten, da Sie zwei %d in der Formatzeichenfolge haben, aber nur einen Parameter übergeben.– Jerry Jeremia
6. August 2018 um 5:11 Uhr
Mögliches Duplikat von Formatbezeichnern für uint8_t, uint16_t, …?
– phuklv
30. April 2019 um 3:57 Uhr