다음 프로그램이 있습니다
#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 데이터 유형” 에도 링크하십시오 .
답변
