Was ist der Formatbezeichner für unsigned short int?

124

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.cder 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 functionsund könnte die richtigen Formatspezifizierer nicht verstehen , wenn die Länge Modifikatoren (wie short, longusw.) mit unsignedfür intDatentyp.

Ist %uder richtige Bezeichner unsigned short int? Wenn ja, warum bekomme ich die oben genannte Warnung?!

EDIT: Die meiste Zeit habe ich es versucht %uhund es gab immer noch die Warnung.

Sangeeth Saravanaraj
quelle
2
printf("%u\n", (unsigned int)length); //funktioniert immer, da die von Ihnen gelesene C99-Spezifikation dies garantiert sizeof(short) <= sizeof(int)(aber die tatsächlichen Antworten auf diese Frage unten sind natürlich viel besser)
Philip
1
Keine Notwendigkeit für die Besetzung; Standardaktionen kümmern sich darum.
R .. GitHub STOP HELPING ICE

Antworten:

155

Versuchen Sie es mit dem "%h"Modifikator:

scanf("%hu", &length);
        ^

ISO / IEC 9899: 201x - 7.21.6.1-7

Gibt an, dass ein folgender Konvertierungsspezifizierer für d, i, o, u, x, X oder n für ein Argument mit dem Typzeiger auf short oder unsigned short gilt .

cnicutar
quelle
47

Für scanfmüssen Sie verwenden, %huda Sie einen Zeiger auf ein übergeben unsigned short. Denn printfes ist unmöglich, eine unsigned shortaufgrund von Standard-Promotions zu übergeben (es wird auf intoder unsigned intabhängig davon, ob intes mindestens so viele Wertbits wie unsigned shortoder nicht hat) heraufgestuft %doder %uist in Ordnung. Sie können es jedoch verwenden, %huwenn Sie es vorziehen.

R .. GitHub HÖREN SIE AUF, EIS ZU HELFEN
quelle
7

Aus der Linux-Handbuchseite:

h Eine folgende Ganzzahlkonvertierung entspricht einem kurzen int oder einem vorzeichenlosen kurzen int-Argument oder einem folgenden
       Die folgende n-Konvertierung entspricht einem Zeiger auf ein kurzes int-Argument.

Um eine vorzeichenlose kurze Ganzzahl zu drucken, sollte die Formatzeichenfolge sein "%hu".

Ein Programmierer
quelle
Ich glaube nicht, dass Sie so kurze Ints "drucken", weil sie automatisch zu Ints befördert werden (genau wie Zeichen).
Alexey Frunze
2
@Alex% hu /% hd in printf funktioniert. Es war% hhu /% hhd, das nur ab C99 verfügbar ist. % h und% hh implizieren ein & 0xFFFF resp. & 0xFF für die übergebene Ganzzahl.
Jørgensen