私は以下のプログラムを持っています
#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]
short
データ型にlong
を使用して長さ修飾子(unsigned
、int
など)を使用する場合、C99 specification - 7.19.6 Formatted input/output functions
を参照したところ、正しいフォーマット指定子を理解できませんでした。
%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引数に対応します。または、次の[n]変換は、short int引数へのポインタに対応します。
そのため、符号なし短整数を出力するには、フォーマット文字列を"%hu"
にする必要があります。
これがprintf
指定子の 良い表 です。それで、それは%hu
のためのunsigned short int
であるべきです。
そして ウィキペディアの "C data types"へのリンク も同様です。