printf

読み:プリント・エフ
外語:printf: print format 英語
品詞:名詞

元々はCで、書式付きの表示を行なうための関数。

目次

C言語の他、C言語の元々のプラットフォームであるUNIXのコマンドとして4.3BSD以降で採用され、またUNIXベースの各種言語(awk、Perlなど)でも採用されている。

互換性のためC++でも利用できるが、C++では書式変換のために他の方法も用意されている。

printf(フォーマット文字列, 値1,値2, 値3...)

フォーマット文字列には、次のようなものがある。詳細は後述する。

  • %s: 文字列
  • %c: 文字
  • %d: int整数(10進数)
  • %ld: long int整数(10進数)
  • %x: 整数(16進数)
  • %f: 実数

様々な関連する関数が定義されている。

  • #include <stdio.h>
    • int printf(const char *format, ...);
    • int fprintf(FILE *stream, const char *format, ...);
    • int sprintf(char *str, const char *format, ...);
    • int snprintf(char *str, size_t size, const char *format, ...);
  • #include <stdarg.h>
    • int vprintf(const char *format, va_list ap);
    • int vfprintf(FILE *stream, const char *format, va_list ap);
    • int vsprintf(char *str, const char *format, va_list ap);
    • int vsnprintf(char *str, size_t size, const char *format, va_list ap);

変換指定

フォーマット文字列は、出力される書式の体裁を指示するための文字列である。そのまま表示される通常文字に加え、%から始まる変換指定が存在する。

変換指定は、%から始まり、変換指定子で終わる。その間には、0個以上のフラグ、最小フィールド幅、精度、長さ修飾子を、この順序にて置くことができる。

具体的な使用例は最後に記載する。

フラグ

#
「別の形式」に変換する時に使う。その機能は、変換指定子によって変わってくる。
o変換では、先頭に0を追加する。
x、X変換では、値が0でない時には、先頭に0xまたは0Xを追加する。
0
値を0で埋める。
d/i/o/u/x/X/a/A/e/E/f/F/g/G変換では、値の左側を、ゼロパディング(通常は空白パディング)する。
-
変換値を、左揃えとする(通常は右揃え)。
-と0を同時に指定した場合は、-が優先される。
+
常に符号(+または-)を置く。通常はマイナスの場合のみ-が置かれる。
空白
値が正の値である場合、符号位置に空白を置く(通常は何も挿入されない)。負の値であれば同位置には-が置かれる。
+と空白を同時に指定した場合は、+が優先される。

この他にも、実装により独自の拡張が存在する。

最小フィールド幅

10進数で、最小のフィールド幅を指定する(頭文字は0以外)。

値が指定されたフィールド幅よりも小さい時は、フラグの指定により、空白やゼロでパディングされる。

値が指定されたフィールド幅よりも大きい時は、適切な幅に拡張される。

精度

数値の変換では、.(ピリオド)に続いて、10進数で精度桁数を指定できる。なお10進数は省略可能で、.(ピリオド)だけの場合は10進数は0が指定されたものとみなす。

整数変換(d/i/o/u/x/X)では、表示する最小桁数を指定する。

実数変換(a/A/e/E/f/F)では、小数点以下に表示する桁数を指定する。

g/Gの変換では、有効数字(整数桁含む)の最大桁数を指定する。

文字列の変換(s/S)では、出力する最大文字数を指定する。

長さ修飾子

整数変換(d/i/o/u/x/X)時、その引数の長さを指定する。

バージョンによって追加があるため、その旨も併記する。併記無きものは全バージョンで利用可能。

長さに関してはsigned/unsignedは問わない。どちらでも同じ修飾子を使う。

hh
実引数がcharである(C99以降)。
h
実引数がshortである。
l
実引数がlongまたはwint_tまたはwchar_tである(後2ヶはC99以降)。
ll
実引数がlong longである(C99以降)。
L
実引数がlong doubleである(C99以降)。
j
実引数がintmax_tまたはuintmax_tである(C99以降)。
z
実引数がsize_tまたはssize_tである(C99以降)。
t
実引数がptrdiff_tである(C99以降)。
q
llと同義。一部実装の独自拡張であり、使うべきでない。

変換指定子

d, i
符号付き10進数に変換する。
u
符号無し10進数に変換する。
o
符号無し8進数に変換する。
x, X
符号無し16進数に変換する(xでは小文字、Xでは大文字で出力)。
e, E
浮動小数点を指数形式に変換する(eでは小文字、Eでは大文字で出力)。
f, F
浮動小数点を小数点形式に変換する(fでは小文字、Fでは大文字で出力)。
g, G
e/Eまたはf/Fのうち適した物を選択し変換する(gでは小文字、Gでは大文字で出力)。
a, A (C99以降)
16進数浮動小数点形式に変換する(aでは小文字、Aでは大文字で出力)。
c
文字
C
一部実装の拡張で、l修飾子付きのc、つまりlcと同義。使うべきでない。
s
文字列
S
一部実装の拡張で、l修飾子付きのs、つまりlsと同義。使うべきでない。
p
ポインター引数を16進数に変換する。
n
出力文字数を整数変数に格納する。
m (glibcの独自拡張)
strerror(errno)の出力
%
%の出力。つまり、%を出力したい時は、%%と書く必要がある。

具体的な使用例

書式補足
10進数16進数8進数 
signed char%hhd  文字、C99以降
unsigned char%hhu%hhx%hho
short%hd   
unsigned short%hu%hx%ho 
int%d   
unsigned int%u%x%o 
long%ld   
unsigned long%lu%lx%lo 
wint_t%lc文字、C99以降
wchar_t%lc文字、C99以降
long long%lld  C99以降
unsigned long long%llu%llx%lloC99以降
書式補足
float%f 実数型
double%f 実数型
long double%Lf 実数型、C99以降
書式補足
intmax_t%jd  C99以降
uintmax_t%ju  C99以降
ssize_t%zd  C99以降
size_t%zu  C99以降
ptrdiff_t%td%tx%toC99以降
書式補足
int32_t%"PRId32"  C99以降、要inttypes.h
uint32_t%"PRIu32"%"PRIx32"%"PRIo32"C99以降、要inttypes.h
int64_t%"PRId64"  C99以降、要inttypes.h
uint64_t%"PRIu64"%"PRIx64"%"PRIo64"C99以降、要inttypes.h

PRIから始まるのは、inttypes.hで#defineされてるマクロである。その環境に応じて適切なフォーマット文字列が定義されている。

関連する用語
C
printf(9)
printk
フォーマット攻撃

コメントなどを投稿するフォームは、日本語対応時のみ表示されます


KisoDic通信用語の基礎知識検索システム WDIC Explorer Version 7.04a (27-May-2022)
Search System : Copyright © Mirai corporation
Dictionary : Copyright © WDIC Creators club