printf, fprintf, sprintf - 書式つき出力変換
【書式】
#include <stdio.h>
int printf(const char *format, ...);
int fprintf(FILE *fp, const char *format, ...);
int sprintf(char *buf, const char *format, ...);
【解説】
printf() は標準出力(stdout)へ、fprintf()はパラメタfpで示されるファイ
ルへ、そしてsprintf()はbufで示される文字型配列へformatで指定した書式
で続くパラメタを変換し、出力します。
printf()は制御文字列(format)を走査して、'%' 以外の文字はそのまま出力
し、 '%'であれば続く変換仕様に従って対応するパラメタを変換して出力し
ます。この変換はナル文字('\0')に出会うまで続きます。
変換仕様とパラメタは、型および個数が一致しなくてはいけません。もしも
これらが一致しないと、おかしな結果が得られることがあります。
変換仕様は以下の形式をとります。
%[flag][width][.[precision]][type]conversion
flagは変換仕様を修飾し、以下のものが指定できます。
-
左づめ出力
+
符号付き数の変換で正の場合+、負の場合-を出力します
' '(空白)
符号付き数の変換で正の場合' '、負の場合-を出力します
#
このフラグを指定すると、
1. o変換では最初の数字は必ず0になります
printf("%#o", 10); -> 012
2. x, X変換では、パラメタが0でなければそれぞれ0x, 0Xがつけられ
ます
printf("%#02x", 10); ->0x0a
3. e, E, f, g, G変換では出力には必ず小数点がつきます。また、g,
G変換では最後に続く0の列も出力されます
printf("%#g", 10.0); -> 10.0000
これら以外の変換では#フラグは無視されます。
+と' 'が同時に指定された場合、+が優先されます。 どれも指定されなかっ
たときは右づめになり、数の出力においてはゼロまたは正の場合は符号はな
く、 負の場合-が付加されます。これらflagはどのような順番に何度現れて
もかまいません。
widthは出力されるフィールド幅を指定する数字の列です。 変換された値の
文字数がフィールド幅に満たないときは、 右づめの場合には空白もしくは0
が左側につめられ、左づめの場合(flagで-を指定した場合) には空白が右側
につめられます。widthの先頭の文字が0の場合、 つめられる文字は 0 とな
り、それ以外は空白です。
フィールド幅指定が省略された場合は変換された値がそのまま出力されま
す。変換された値の文字数がフィールド幅を越えた場合は、フィールド幅指
定が省略された場合と同じです。 また、フィールド幅に0を指定した場合は
幅指定が省略されたとみなされます。
フィールド幅は変数や式であたえることもできます。widthに * を指定する
と、対応するint型のパラメタの値が使われます。
precisionは精度を指定します。precisionは変換の型によって扱いが異なり
ます。d, o, u, x, X変換では出力される最小の桁数を示し、省略時は1とみ
なされます。e, E, f変換では小数点以下の桁数を示し、省略時は6とみなさ
れます。g, G変換では有効桁数を示し、省略時は6とみなされます。s変換で
は出力される文字列の長さを示し、 省略時は文字列全体の大きさとなりま
す。 c変換ではprecisionは効果を持ちません。.(ピリオド)のみが現れた場
合は、prescisionは0が指定されたとみなされます。precisionの指定による
動作の詳細はconversionを参照してください。
このフィールドもwidthフィールドと同様に*指定によって変数や式であたえ
ることができます。
typeは変換に使用される型を決定します。以下のものが指定できます。
h
d, o, u, x, X変換時に、対応するパラメタの型がshort intもしくは
unsigned short int型であることを示します
l
d, o, u, x, X変換時に、対応するパラメタの型がlong intもしくはint
unsigned long int型であることを示します
L
e, E, f, g, G変換時に、対応するパラメタの型がlong double型である
ことを示します
F
p変換時にfarポインタであることを示します
N
p変換時にnearポインタであることを示します
typeが省略された場合、d, o, u, x, X変換ではintもしくはunsigned int型
のパラメタを取るものと仮定します。また、e, E, f, g, G変換ではdouble
型を取るものと仮定します。float型はdouble 型に自動的に変換されて呼び
出しが実行されますので、 float型とdouble型の判別のための文字はありま
せん。h, l, Lはどのような順番に何回現れてもかまいませんが、最後に現
れた文字が有効になります。変換と無関係の型が指定された場合にはtypeが
省略されたとみなします。
conversionは変換の形式を決定する文字で、省略できません。以下のものが
指定できます。
d, i, o, u, x, X
int 型(short, long を含む) のパラメタを、符号付き10進数(d, i)、
符号なし8進数(o)、符号なし10進数(u)、符号なし16進数(x, X)に変換
して出力します。10-15を表すためにx変換では小文字のa - f を使用
し、X変換ではA - Fを使用します。
precision は出力される最小の桁数を指定します。もし変換された値の
文字数がprecision よりも小さい場合は、 先頭に 0 がつめられます。
precision が 0 のときは、 値が 0 であればその0は出力されません。
precisionが省略された時には1が指定されたとみなされます
c
char型のパラメタを取り出して出力します。precision は効果を持ちま
せん
s
パラメタをchar *として取り出し、そのポインタが指す文字列を出力し
ます。文字列は終わりを示すナル文字('\0')の直前まで出力されるか、
またはprecisionで示される長さだけ出力されます。precisionが省略さ
れた場合は文字列全体が出力されます
n
パラメタを int *として取り出し、そのポインタが指す変数にこれまで
に出力された文字数を代入します。 この変換はなにも出力しません。
precisionは効果を持ちません
p
パラメタをポインタとして取り出して出力します
e, E
浮動小数点数を[-]d.ddde[+-]dd の形式で出力します。小数点の前に 1
桁のゼロでない数字があり、 小数点以下にprecisionで指定した桁数の
数字が続きます。 precision が省略された時には 6 とみなされます。
precisionに0を指定した場合は小数点は出力されません。値は出力され
ている桁あるいは最大有効桁で四捨五入されます。 指数部はe変換の場
合はeで、E変換の場合はEで始ります。次に符号が出力され、 指数が少
なくとも2桁出力されます
f
浮動小数点数を [-]ddd.ddd の形式で出力します。小数点以下の桁数は
precisionで指定した数で、省略時には6とみなされます。precision が
0の場合には小数点は出力されません。四捨五入はe, E変換と同様に実
行されます。小数点の前には少なくとも1桁の数字が出力されます。
g, G
浮動小数点数をf変換、またはe変換(gが指定されているとき。G が指定
されていれば E変換)して出力します。precisionは有効桁数を指定しま
す。指数部が-4より小さい場合、もしくはprecision より大きい場合に
e, E変換され、それ以外ではf変換されます。数字の最後に続く0の列は
出力されません。また、小数点以下に数値が存在する時のみ小数点が出
力されます。
浮動小数点数の変換ではパラメタの値が無限大の場合には"infinity"と出力
されます。 上記以外の変換仕様は無視され、%の次の文字からそのまま出力
されます。したがって制御文字列中に%%と書けば、%自身が出力されます。
printf()一族はライブラリファイルdoslib.libとintlib.libの両方に含まれ
ています。intlib.libに含まれているprintf()には、浮動小数点数の表示機
能(f, e, E, g, G)がありません。これは、浮動小数点数の表示を必要とし
ない多くのプログラムにムダな浮動小数点演算パッケージをリンクしないよ
うにして、作成した実行ファイルを小さくするために用意しました。こちら
のprintf()を使う場合には、次のようにintlib.libをライブラリとして指定
してください。
lcc prog.c -lintlib
【リターン値】
出力された文字数を返します。出力エラーが生じた時は-1を返します。
sprintf()では最後に置かれるナル文字('\0')の数は含みません。
【可搬性】
sprintf()
ANSI, UNIX, DOS窓
それ以外
ANSI, UNIX, DOS窓
【参照】
scanf(3), vprintf(3)
【バグ】
sprintf()はbufに変換結果が入るだけの余裕があるかどうかのチェックはし
ません。bufには十分な領域を取っておいてください。
【copyright (c) 安江正樹@東海大学理学部物理学科】