表示テーマ
printf format specifier — 型と書式指定子
TL;DR
printf の書式指定子は実引数の型に合わせます。size_t は %zu、オブジェクトポインタは (void *) に変換して %p です。以下はISO C99以降のprintf用の表です。
早見表
| 書式 | 対応する引数の型 | 用途・注意 |
|---|---|---|
%d | int | 符号付き10進 |
%u | unsigned int | 符号なし10進 |
%x | unsigned int | 16進 |
%ld | long | longの10進 |
%lld | long long | C99以降 |
%zu | size_t | sizeof、strlenの結果。C99以降 |
%f | double | floatは可変引数でdoubleに昇格 |
%Lf | long double | 大文字のLを使う |
%c | int | 1文字を出力 |
%s | 文字配列の先頭へのポインタ | 精度指定なしならNULL終端が必要 |
%p | void * | 表示形式は処理系定義 |
%% | 引数なし | パーセント記号そのもの |
%c に通常の char を渡すと整数拡張を受けます。%s にはNULLポインタを渡さないでください。
Example
c
#include <stdio.h>
#include <string.h>
int main(void)
{
int value = 42;
const char *text = "hello";
printf("value=%d, hex=%x\n", value, (unsigned int)value);
printf("length=%zu, text=%s\n", strlen(text), text);
printf("address=%p\n", (void *)&value);
printf("ratio=%.2f, progress=100%%\n", 0.125);
return 0;
}Pitfalls
型の不一致は未定義動作
sizeof の結果を %d で出力しないでください。サイズが偶然同じでも型が合うことにはなりません。%p は関数ポインタの移植可能な表示方法ではありません。
外部入力をそのまま書式文字列に使わず、printf("%s", text) とします。入力中の % が書式として解釈されるのを防げます。
scanf の %f は float *、%lf は double * を要求します。printfの表をscanfへ流用しないでください。
Related
参考
C11委員会草案 N1570 §7.21.6.1、§7.21.6.2、§6.5.2.2。