PRINTF(3S) — NEWS-OS Programmer’s Manual
名称
printf, fprintf, sprintf − 書式付き出力の変換
形式
#include <stdio.h>
int printf(format [, arg ] ... )
char ∗format;
int fprintf(stream, format [, arg ] ... )
FILE ∗stream;
char ∗format;
int sprintf(s, format [, arg ] ... )
char ∗s, ∗format;
#include <varargs.h>
int _doprnt(format, args, stream)
char ∗format;
va_list ∗args;
FILE ∗stream;
解説
printf は、 標準出力ストリーム stdout に出力します。 fprintf は、 指定出力ストリーム stream に出力します。 sprintf は、 文字列 s に‘\0’で終わる‘出力’を 代入します。 これらの関数はすべて、 可変長引数を処理する varargs(3) を使用し、 内部関数 _doprnt を 呼び出すことで実現されています。
これらの関数はいずれも、 出力エラーの場合 EOF を返し、 そうでない場合、 出力したバイト数(sprintf() では、最後の ’\0’ を含まない)を返します。
これらの関数はそれぞれ、 引数 format の制御に従い、 それ以降の引数を 変換、 編集、 出力します。 引数 format は、2つのタイプのオブジェクトを 含む文字列です。 1つは普通の文字列で、 出力ストリームにそのままコピーされます。 もう1つは変換仕様で、 この場合次に続く printf の arg の変換および出力を 行います。
printf の書式は次のような形式を持っています。
%[フラグ][フィールド幅][.精度][h|l]型
各変換仕様は、 文字 % で始まり、 それ以降は次に述べる部分を その順に含みます。
• 0 個以上の次に述べるフラグ :
• 文字 ‘#’は、 値を “代替形式”に変換するべきことを 指定します。 c、 d、 i、 s、 u 変換の場合、 このオプションは意味がありません。 o 変換の場合、 出力文字列の 1文字目が ゼロになるように精度を 上げます。 x(X) 変換の場合、 結果がゼロでなければ、 その先頭に 0x(0X) 文字列を 付加します。 e、 E、 f、 g、 G 変換の場合、 小数点以下の数字がなくても、 結果が常に小数点を 含むようにします (通常、これらの変換では小数点以下の数字がある場合にのみ、 小数点が表示されます)。 g、G 変換の場合、 後ろに続く 0 は取り除きません (‘#’ がないと取り除かれます)。
• マイナス符号‘−’は、 表示フィールド内で、 変換された値の「左寄せ」を 指定します。
• 文字‘+’は、 符号付き変換の場合、 値の先頭にいつも符号が付くべきことを 指定します。
• 空白は、 符号付き変換の場合、 正の値の先頭にブランクを 付けるべきことを 指定します。 もし、 ‘+’とブランク両方とも利用できる場合、 ‘+’の方を 付けます。
• フィールド幅 を 指定する省略可能な数字列。 変換された値の桁数がフィールド幅より小さい場合、 その左側に(左寄せ指定が与えられている場合は右側に)、 フィールド幅になるまで空白を 追加します。 フィールド幅が 0 で始まっている場合、 ブランクの代わりに、 ゼロを 追加します。
• 省略可能なピリオド ‘.’ は、 次の数字文字列とフィールド幅を 区別するために使います。
• 省略可能な精度を 指定する数字列。
d、 i、 o、 u、 x、 X の場合は、.n は、少なくとも n 桁がプリントされることを 指定します。入力引数が n 桁より少ない場合は、出力値は 左側がゼロで埋められます。入力引数が n 桁より大きくても、 出力値は削られません。
e、 E、 f の場合、.n は、小数点の後に n 文字プリントされることを 指定します。最後の桁は丸められます。
g、 G の場合、.n は、最大 n 桁の有効数字がプリントされることを指定します。
c の場合、.n は、出力に対して何の影響も与えません。
s の場合、.n は、 n 文字より多くの文字がプリントされない ことを指定します。
• 文字 l は、 次に続く d および o、 x、 u が、 long int の arg に対応することを 示します。 文字 h は、 次に続く d および o、 x、 u が、 short int の arg に対応することを 示します。
• 適用される変換の型を 指定する文字。
フィールド幅あるいは精度は、 数字列の代わりに‘∗’で示すことが可能です。 この場合、 int の arg がフィールド幅あるいは精度を 与えます。 変換文字とそれらの意味は、 次の通りです。
d, i int の arg を、 10進数表記に変換します。
o int の arg を、 8進数表記に変換します。
x, X int の arg を、 16進数表記に変換します。
f 浮動小数点または倍精度浮動小数点の arg を、 ‘[−]ddd.ddd’ という形式で 10進数表記に変換します。 ここで、 小数点以降の d の数は、 引数で指定した精度に等しい。 指定精度がない場合、 6 桁が与えられます。 また、 精度が明示的に 0 で指定される場合、 小数点は出力されません。 もし arg が NaN (Not a Number) ならば、NaN が出力され、 +∞ や −∞ の場合は、 それぞれ +Infinity や −Infinity が表示されます。
e 浮動小数点または倍精度浮動小数点の arg を、 ‘[−]d.ddde±dd’ という形式に変換します。 ここで、 小数点の前は 1 桁、 小数点の後の桁数は引数で指定した精度に等しい。 指定精度がない場合、 6 桁が出力されます。 arg が NaN (Not a Number) ならば、NaN が出力され、 +∞ や −∞ の場合は、 それぞれ +Infinity や −Infinity が表示されます。
g 浮動小数点または倍精度浮動小数点 arg を、 d または f、 e 形式で出力します。 どの場合が、 全精度を 最もコンパクトに表示するかによって決まります。
E e と同じ、ただ指数部を示す記号が E となります。
G g と同じ、ただ e 形式が使用される時は、 指数部を示す記号が E となります。
c 文字 arg を出力します。
s arg は、 文字列(文字列ポインタ)で与えられ、 そのポインタの指す文字がナルになるまで、 または指定精度で示される文字数に達するまで、 その文字を出力します。 しかし、 精度が 0、 または指定されない場合、 ナル文字に達するまで全ての文字を 出力します。
u unsigned int の arg を 10進数に変換し出力します。 (変換した結果は、 0 から MAXUNIT までの範囲にある値。 ここで、 MAXUNIT は、 NEWS では 4294967295。 )
n arg は、 int を示すポインタが与えられ、 これまで書かれた文字のバイト数を( arg によって示された場所に)格納します。
p arg をポインタとしてプリントします。
% ‘%’そのものを 出力します。 引数の変換はしません。
フィールド幅の指定がない、 あるいはそれが小さい場合でも、 フィールドの切捨ては行いません。 指定フィールドの幅が実際の幅を 超える場合は、 適当にパディングされます。 printf によって生成された文字は、 putc(3s) によって出力されます。
使用例
日付と時刻を ‘Sunday,July 3,10:02’という形式で出力するには、 次のようにします。 ここで、 weekday および month は、 ナルで終わる文字列を 指すポインタです。
printf("%s, %s %d, %02d:%02d", weekday, month, day, hour, min);
π を 5 桁まで出力するには、 次のようにします。
printf("pi = %.5f", 4∗atan(1.0));
関連事項
バグ
NEWS-OS 3.4 および 3.91R 以前の sprintf(s, ...) は、 バイト数ではなく、s の値を返していました。
NEWS-OSRelease 4.2.1R