Ich habe folgendes Programm
#include <stdio.h>
int main(void)
{
unsigned short int length = 10;
printf("Enter length : ");
scanf("%u", &length);
printf("value is %u \n", length);
return 0;
}
Was beim Kompilieren mit gcc filename.c
gab die folgende Warnung aus (in der scanf()
Linie).
warning: format ‘%u’ expects argument of type ‘unsigned int *’, but argument 2 has type ‘short unsigned int *’ [-Wformat]
Die habe ich dann verwiesen C99 specification - 7.19.6 Formatted input/output functions
und konnte den korrekten Formatbezeichner bei Verwendung der Längenmodifikatoren (wie z short
, long
usw.) mit unsigned
zum int
Datentyp.
Ist %u
der richtige Spezifizierer unsigned short int
? Wenn ja, warum erhalte ich die oben erwähnte Warnung?!
EDIT: Die meiste Zeit habe ich versucht %uh
und es gab immer noch die Warnung.
Versuchen Sie es mit der "%h"
Modifikator:
scanf("%hu", &length);
^
ISO/IEC 9899:201x-7.21.6.1-7
Gibt an, dass ein folgender Konvertierungsbezeichner d , i , o , u , x , X oder n auf ein Argument mit Typ angewendet wird Zeiger auf short oder unsigned short.
Zum scanf
müssen Sie verwenden %hu
da Sie einen Zeiger auf eine übergeben unsigned short
. Zum printf
es ist unmöglich, an zu übergeben unsigned short
aufgrund von standardmäßigen Beförderungen (es wird befördert zu int
oder unsigned int
je nachdem ob int
hat mindestens so viele Wertbits wie unsigned short
oder nicht) also %d
oder %u
ist gut. Die Nutzung steht Ihnen frei %hu
wenn es dir lieber ist.
Von der Linux-Handbuchseite:
h A following integer conversion corresponds to a short int or unsigned short int argument, or a fol‐
lowing n conversion corresponds to a pointer to a short int argument.
Um also eine vorzeichenlose kurze Ganzzahl zu drucken, sollte die Formatzeichenfolge sein "%hu"
.
Hier ist ein guter Tisch zum printf
Spezifizierer. So sollte es sein %hu
zum unsigned short int
.
Und Link zu Wikipedia “C-Datentypen” zu.
printf("%u\n", (unsigned int)length); //
funktioniert immer, da die von Ihnen gelesene C99-Spezifikation dies garantiertsizeof(short) <= sizeof(int)
(aber die eigentlichen Antworten auf diese Frage unten sind natürlich viel schöner)– Philipp
2. Januar 2012 um 14:39 Uhr
Keine Notwendigkeit für die Besetzung; Standardaktionen kümmern sich darum.
– R.. GitHub HÖR AUF, EIS ZU HELFEN
2. Januar 2012 um 15:37 Uhr