8.4.25 printfコマンド(書式の引数を書式に従って変換し,標準出力に出力する)
形式
printf 書式 [書式の引数 ...]
機能
書式の引数を書式に従って変換し,標準出力に出力します。
引数
書式
書式は,次の3種類の文字列で構成されます。
-
標準出力に出力する文字
-
変換指定
-
エスケープ文字
変換指定は変換指定を示す%の後ろに,フラグ文字,最小フィールド幅,精度,変換指定子の順で指定します。フラグ文字,最小フィールド幅,精度の指定は省略できます。
-
変換指定
%
変換指定を示します。
-
フラグ文字列
変換指定を示す%の後ろに次のフラグ文字を指定できます。この項目は指定を省略できます。
フラグ文字
意味
-
変換の結果はフィールド内で左そろえになります。
このフラグ文字を指定していない場合,右そろえになります。
+
符号付き変換の結果に符号+,または-が付きます。
このフラグ文字を指定していない場合,変換の結果が負の値の時だけ-が付きます。
スペース
符号付き変換の結果で,正の数値の前にスペースが付きます。
+フラグ文字と同時に指定した場合は,+フラグ文字が優先されます。
#
以下の変換指定子を指定した時に,変換の結果を別の形式で出力します。
-
o変換の場合,変換結果の先頭に0が付きます(変換の結果の0は除きます)。
-
x,X変換の場合,変換結果の先頭に0xまたは0Xが付きます(変換の結果の0は除きます)。
-
e,E,f,g,G変換の場合,小数点を含まない値を指定しても,必ず小数点を付けて出力します。
-
gとG変換の場合,末尾の0は変換結果から削除されません。
0
d,i,o,u,x,X,e,E,f,gおよびG変換の場合,変換結果のフィールド内の左側のスペースを0で埋めます。
-フラグ文字,もしくは変換指定子d,i,o,u,x,Xの精度と共に指定した場合は,0フラグ文字は無視されます。
-
-
最小フィールド幅
最小フィールド幅を10進数で指定します。最小フィールド幅は0〜2147483647の範囲で指定できます。この項目は指定を省略できます。変換された値の文字数がフィールドよりも少ない場合,フィールドの左側をスペースで埋めます。ただし,左そろえのフラグ文字が指定されている場合は右側をスペースで埋めます。変換結果がフィールド幅よりも広い場合,フィールドは変換結果が入る幅に広げられます。アスタリスク(*)を指定した場合,書式の引数に指定した値を最小フィールド幅として使用します。
-
精度
精度は,ピリオド(.)とそれに続く10進数で指定します。UNIXの場合は0〜2147483647の範囲で,Windowsの場合は0〜512の範囲で指定できます。この項目は指定を省略できます。ピリオド(.)だけを指定した場合は0が指定されたと仮定します。d,i,o,u,xまたはX変換では,表示する最小の桁数を指定します。e,Eおよびf変換では表示する小数点以下の桁数を指定します。g,G変換では最大有効桁数を指定します。s変換では表示する文字列の最大バイト数を指定します。値の代わりにアスタリスク(*)を指定した場合,書式の引数に指定した値を使用します。
-
変換指定子
変換指定子
意味
d,i
符号付き10進数表記に変換します。
精度は表示する最小桁数を指定します。変換後の値が精度で指定した桁数に満たない場合は,値の先頭に0が付きます。デフォルトの精度は1です。
精度に0を指定し,値0を変換した場合,空文字を出力します。
o
符号なし8進数表記に変換します。
精度は表示する最小桁数を指定します。変換後の値が精度で指定した桁数に満たない場合は,値の先頭に0が付きます。デフォルトの精度は1です。
精度に0を指定し,値0を変換した場合,空文字を出力します。
u
符号なし10進数表記に変換します。
精度は表示する最小桁数を指定します。変換後の値が精度で指定した桁数に満たない場合は,値の先頭に0が付きます。デフォルトの精度は1です。
精度に0を指定し,値0を変換した場合,空文字を出力します。
x,X
16進数表記に変換します。xを指定した場合は小文字(abcdef)で表記し,Xを指定した場合は大文字(ABCDEF)で表記します。
精度は表示する最小桁数を指定します。変換後の値が精度で指定した桁数に満たない場合は,
値の先頭に0が付きます。デフォルトの精度は1です。
精度に0を指定し,値0を変換した場合,空文字を出力します。
e,E
浮動小数点数を[-]d.dddde± dd[d]の10進数スタイルに変換します。
eを指定した場合は小文字で表記し,Eを指定した場合は大文字で表記します。
小数点の前は1桁です。また,小数点以下の桁数は,精度を指定していない場合は6桁,精度を指定した場合は指定した桁数です。また,精度に0を指定した場合,小数点以下は出力されません。
f
浮動小数点数を[-]dddd.ddddの10進数スタイルに変換します。
小数点の前は1桁以上表示されます。また,小数点以下の桁数は,精度を指定していない場合は6桁,精度を指定した場合は指定した桁数です。
g,G
浮動小数点数をスタイルfまたはe,Eの形式で表示します。
表示するスタイルは変換される値によって異なります。
表示する桁数は,精度を指定していない場合は6桁,精度を指定した場合は指定した桁数となります。末尾の0は変換結果から削除されます。
c
書式の引数の最初の1バイトを表示します。
s
書式の引数を文字列と解釈して表示します。
精度を指定していない場合は文字列すべてを表示し,精度を指定した場合は指定した値のバイト数分を表示します。
ただし,OSの仕様で,精度を指定して出力する区切りがマルチバイト文字の途中の場合,出力するバイト数は指定値より少なくなることがあります。
%
%を表示します。
フラグ文字,最小フィールド幅,精度の指定はできません。
b
書式の引数を文字列と解釈して表示します。
文字列に含まれているエスケープ文字も文字列として解釈し,変換表示します。
ただし,書式の引数の文字列に\cが現れた場合は,それ以降の変換は表示されません。
フラグ文字,最小フィールド幅,精度の指定はできません。
-
エスケープ文字
使用できるエスケープ文字を次の表に示します。
エスケープ文字
意味
\a
アラート文字(ベル)
\b
バックスペース文字
\f
フォームフィード文字(改ページ)
\n
改行文字
\r
復帰文字
\t
タブ文字
\v
垂直タブ文字
\d,\dd,\ddd
1〜3桁の8進数で表されたASCIIコードの文字(0〜7)
\xhex
1〜2桁の16進数で表されたASCIIコードの文字(0〜9,a〜f,A〜F)
\\
\の表示
\'
'の表示
\"
"の表示
上記以外で文字列に\が含まれる場合は,\も出力されます。
書式の引数
-
書式に指定した変換指定の数より,書式の引数に指定した数が多い場合は,書式を繰り返し使用します。余分な書式は0またはNULLで評価されます。
例
$ printf "%x %d " 123 456 789 7b 456 315 0
-
数値変換の場合,書式の引数で文字の前にシングルクォーテーション('),またはダブルクォーテーション(")を付加するとASCIIコードで出力されます。
例
$ printf "%x %x" \'a \"b 61 62
-
変換指定子d,i,o,u,x,Xの書式の引数に数値を指定する場合,8進数(0指定),10進数,16進数(0x指定)が指定できます。
例
$ printf "%d %d %d" 010 10 0x10 8 10 16
終了コード
終了コード |
意味 |
---|---|
0 |
正常終了。 |
1 |
エラー終了。 |
注意事項
改行文字は,Windowsの場合は[CR]+[LF],UNIXの場合は[LF]で出力されます。
printfコマンドは,変換指定子d,i,o,u,x,Xを指定して出力および変換する場合,4バイトの整数で扱います。変換指定子e,E,f,g,Gを指定して出力および変換する場合は倍精度浮動小数点数(8バイト)として扱います。このため,変換結果に誤差が発生します。この誤差はOSに依存します。
使用例
フラグ文字に#0,最小フィールド幅に10を指定して,16数変換した内容を出力します。
$ ./printf "%#010x\n" 123 0x0000007b
フラグ文字に#+を指定して10進数変換した内容を出力します。
$ ./printf "%#+d\n" 123 +123
精度に8を指定して浮動小数点をf形式に変換した内容を出力します。
$ ./printf "%.8f\n" 123.456 123.45600000
指定した浮動小数点をe形式に変換した内容を出力します。
$ ./printf "%e\n" 123.456 1.234560e+02
文字列abcdefのうち,1バイト分を出力します。
$ ./printf "%c\n" abcdef a
-
精度に3を指定し,文字列abcdefを出力します。
$ ./printf "%.3s\n" abcdef abc
-
書式にエスケープ文字(\t)を指定して,書式の引数に指定された内容を出力します。
$ ./printf "%s %d\txyz\n" abc 123 abc 123 xyz
-
フラグ文字に0,精度に*(アスタリスク)を指定して出力します。
この場合,*(アスタリスク)は5に置き換えられます。
$ ./printf "%0*d" 5 123 00123