다음 프로그램이 있습니다
#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
등)과을unsigned
int
데이터 유형에 대해 .
이다 %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 데이터 유형” 에도 링크하십시오 .