2012-01-02 12 views
90

mam następujący programJaki jest specyfikator formatu dla unsigned short int?

#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; 
} 

Które gdy skompilowany przy użyciu gcc filename.c wydał następujące ostrzeżenie (w linii scanf()).

warning: format ‘%u’ expects argument of type ‘unsigned int *’, but argument 2 has type ‘short unsigned int *’ [-Wformat]

Następnie przekazał C99 specification - 7.19.6 Formatted input/output functions i przy użyciu modyfikatorów długości (jak short, long ITP) z unsigned do int typ danych nie mógł zrozumieć prawidłowym formacie specyfikator.

Czy %u jest prawidłowym specyfikatorem unsigned short int? Jeśli tak, dlaczego otrzymuję powyższe ostrzeżenie ?!

EDYCJA: Przez większość czasu próbowałem %uh i wciąż dawałem ostrzeżenie.

+2

'printf ("% u \ n ", (unsigned int) długość); // "zawsze działa, ponieważ odczytany C99 gwarantuje, że' sizeof (short) <= sizeof (int) '(ale rzeczywiste odpowiedzi na to pytanie poniżej są oczywiście dużo lepsze) – Philip

+1

Nie ma potrzeby obsady; domyślne promocje zajmują się tym. –

Odpowiedz

118

Spróbuj pomocą "%h" modyfikator:

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

ISO/IEC 9899: 201X - 7.21.6.1-7

określa, że ​​po d, O, U, X, X Konieczne jest zastosowanie przelicznika dla argumentu o typie wskazujący na krótki lub niepodpisany krótki.

+0

Dokumentacja źródłowa, proszę? – sergiol

+1

@sergiol Dodałem źródło. – cnicutar

6

z podręcznika stronie Linux:

 
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. 

Tak, aby wydrukować short integer, string format powinien być "%hu".

+0

Nie sądzę, że w ten sposób "printf" krótkie ints, ponieważ są one automatycznie promowane do ints (podobnie jak znaki). –

+2

@Alex% hu /% hd w printf działa. To było% hhu /% hhd, które jest dostępne tylko od C99. % h i% hh implikują a i 0xFFFF wzgl. & 0xFF na przekazanej liczbie całkowitej. –

+0

@ jørgensen: masz rację, jest w standardzie. –

36

Dla scanf należy użyć %hu, ponieważ przekazujesz wskaźnik do unsigned short. Dla printf, że to niemożliwe, aby zdać unsigned short spowodowane promocjami domyślnych (będzie promowany do int lub unsigned int w zależności od tego, czy int ma co najmniej tyle bitów wartość jako unsigned short lub nie) tak %d lub %u jest w porządku. Jeśli wolisz, możesz korzystać z usługi %hu.

+6

+1 za wzmiankę o domyślnych promocjach w 'printf()'. Dzięki! –