[c] 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;
}

사용하여 컴파일 gcc filename.c하면 다음 경고가 발생합니다 ( scanf()줄에서).

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

나는 다음을 참조 C99 specification - 7.19.6 Formatted input/output functions길이 수정 (같이 사용할 때 올바른 형식 지정자를 이해할 수 없었다 short, long등)과을unsignedint 데이터 유형에 대해 .

이다 %u 올바른 지정은 unsigned short int? 그렇다면 위에서 언급 한 경고가 표시되는 이유는 무엇입니까?!

편집 : 대부분의 시간 동안 노력 %uh하고 있었고 여전히 경고를하고있었습니다.



답변

"%h"수정자를 사용해보십시오 .

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

ISO / IEC 9899 : 201x-7.21.6.1-7

다음 d, i, o, u, x, X 또는 n 변환 지정자가 short 또는 unsigned short에 대한 유형 포인터가 있는 인수에 적용되도록 지정합니다 .


답변

의 경우 scanf%hu포인터를 전달하므로 unsigned short. 들어 printf그것이 통과하는 것은 불가능하다, unsigned short프로모션을 기본값으로 인해이 (가로 승격됩니다 int또는 unsigned int여부에 따라 int적어도 많은 가치와 같은 비트로이 unsigned short없음) 그래서 %d%u괜찮습니다. %hu하지만 원하는 경우 무료로 사용할 수 있습니다.


답변

Linux 매뉴얼 페이지에서 :

h 다음 정수 변환은 short int 또는 unsigned short int 인수 또는 fol-
       lowing n 변환은 짧은 int 인수에 대한 포인터에 해당합니다.

따라서 부호없는 짧은 정수를 인쇄하려면 형식 문자열이 "%hu".


답변

다음은 지정 자를위한 좋은 표 입니다 printf. 그래서해야합니다 %hu위해 unsigned short int.

그리고 Wikipedia “C 데이터 유형” 에도 링크하십시오 .


답변