Ich habe das folgende 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
der folgenden Warnung ausgegeben wurde (in der scanf()
Zeile).
warning: format ‘%u’ expects argument of type ‘unsigned int *’, but argument 2 has type ‘short unsigned int *’ [-Wformat]
Ich verweisen dann die C99 specification - 7.19.6 Formatted input/output functions
und könnte die richtigen Formatspezifizierer nicht verstehen , wenn die Länge Modifikatoren (wie short
, long
usw.) mit unsigned
für int
Datentyp.
Ist %u
der richtige Bezeichner unsigned short int
? Wenn ja, warum bekomme ich die oben genannte Warnung?!
EDIT: Die meiste Zeit habe ich es versucht %uh
und es gab immer noch die Warnung.
printf("%u\n", (unsigned int)length); //
funktioniert immer, da die von Ihnen gelesene C99-Spezifikation dies garantiertsizeof(short) <= sizeof(int)
(aber die tatsächlichen Antworten auf diese Frage unten sind natürlich viel besser)Antworten:
Versuchen Sie es mit dem
"%h"
Modifikator:quelle
Für
scanf
müssen Sie verwenden,%hu
da Sie einen Zeiger auf ein übergebenunsigned short
. Dennprintf
es ist unmöglich, eineunsigned short
aufgrund von Standard-Promotions zu übergeben (es wird aufint
oderunsigned int
abhängig davon, obint
es mindestens so viele Wertbits wieunsigned short
oder nicht hat) heraufgestuft%d
oder%u
ist in Ordnung. Sie können es jedoch verwenden,%hu
wenn Sie es vorziehen.quelle
Aus der Linux-Handbuchseite:
Um eine vorzeichenlose kurze Ganzzahl zu drucken, sollte die Formatzeichenfolge sein
"%hu"
.quelle
Hier ist eine gute Tabelle für
printf
Spezifizierer. So soll es sein%hu
fürunsigned short int
.Und Link zu Wikipedia "C Datentypen" auch.
quelle