Skip to content

printf format specifier — 型と書式指定子

TL;DR

printf の書式指定子は実引数の型に合わせます。size_t%zu、オブジェクトポインタは (void *) に変換して %p です。以下はISO C99以降のprintf用の表です。

早見表

書式対応する引数の型用途・注意
%dint符号付き10進
%uunsigned int符号なし10進
%xunsigned int16進
%ldlonglongの10進
%lldlong longC99以降
%zusize_tsizeof、strlenの結果。C99以降
%fdoublefloatは可変引数でdoubleに昇格
%Lflong double大文字のLを使う
%cint1文字を出力
%s文字配列の先頭へのポインタ精度指定なしならNULL終端が必要
%pvoid *表示形式は処理系定義
%%引数なしパーセント記号そのもの

%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%ffloat *%lfdouble * を要求します。printfの表をscanfへ流用しないでください。

参考

C11委員会草案 N1570 §7.21.6.1、§7.21.6.2、§6.5.2.2。