What is the format specifier for unsigned short int?

Sangeeth Saravanaraj picture Sangeeth Saravanaraj · Jan 2, 2012 · Viewed 288.3k times · Source

I have the following program

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

Which when compiled using gcc filename.c issued the following warning (in the scanf() line).

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

I then referred the C99 specification - 7.19.6 Formatted input/output functions and couldn't understand the correct format specifier when using the length modifiers (like short, long, etc) with unsigned for int data type.

Is %u the correct specifier unsigned short int? If so why am I getting the above mentioned warning?!

EDIT: Most of the time, I was trying %uh and it was still giving the warning.

Answer

cnicutar picture cnicutar · Jan 2, 2012

Try using the "%h" modifier:

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

ISO/IEC 9899:201x - 7.21.6.1-7

Specifies that a following d , i , o , u , x , X , or n conversion specifier applies to an argument with type pointer to short or unsigned short.