Was ist der Formatbezeichner für unsigned short int?

Lesezeit: 2 Minuten

Benutzeravatar von Sangeeth Saravanaraj
Sangeeth Saravanaraj

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, longusw.) 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.

  • printf("%u\n", (unsigned int)length); // funktioniert immer, da die von Ihnen gelesene C99-Spezifikation dies garantiert sizeof(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

Benutzeravatar von cnicutar
Cnicutar

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 scanfmüssen Sie verwenden %hu da Sie einen Zeiger auf eine übergeben unsigned short. Zum printfes 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".

  • Ich glaube nicht, dass Sie auf diese Weise kurze Ints “printf”, da sie automatisch zu Ints befördert werden (genau wie Zeichen).

    – Alexey Frunze

    2. Januar 2012 um 11:00 Uhr

  • @Alex %hu/%hd in printf funktioniert. Es war %hhu/%hhd, das erst ab C99 verfügbar ist. %h und %hh implizieren ein &0xFFFF bzw. &0xFF auf der übergebenen Ganzzahl.

    – Jörgensen

    2. Januar 2012 um 13:11 Uhr


Benutzeravatar von FooBar167
FooBar167

Hier ist ein guter Tisch zum printf Spezifizierer. So sollte es sein %hu zum unsigned short int.

Und Link zu Wikipedia “C-Datentypen” zu.

1424440cookie-checkWas ist der Formatbezeichner für unsigned short int?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy