 |
≫ |
|
|
 |
名称printf(), fprintf(), sprintf(), snprintf() ― フォーマットされた出力 構文#include <stdio.h> int printf(const char *format, /* [arg,] */ ...); int fprintf(FILE *stream, const char *format, /* [arg,] */ ...); int sprintf(char *s, const char *format, /* [arg,] */ ...); int snprintf(char *s, size_t maxsize, const char *format, /* [arg,] */ ...); 説明printf() は、標準出力ストリーム stdout に出力を送ります。 fprintf() は、 stream として指定された出力ストリームに出力を送ります。 sprintf() は、 *s から始まる連続したバイトに「出力」し、null
文字 (\0) を付加します。 充分な記憶領域があることをユーザー側で確認して使用してください。 snprintf() は、 sprintf() と同様に動作しますが、あて先のバッファーに書き込む
(末尾の NULL 文字も含めた) 文字数を、 maxsize までに制限します。 それぞれの関数は format に従って arg を変換し、フォーマットし、プリントします。 format は 2 種類の情報を含んだ文字列です。1 つは単なる文字データで、そのまま出力ストリームにコピーされます。もう 1 つは変換指定子で、これによって実際の arg の変換、プリントが行われます。 format に対して不適当な arg がある場合、出力結果は保証されません。 arg の方が format に比べて多い場合は、余分な arg は無視されます。 それぞれの変換指定子は文字 % または %n$ で始まります。ここで、 n は 1 から {NL_ARGMAX} までの 10 進数整数です
(NL_ARGMAX は <limits.h> で定義されています)。 %n$ 構文はこの変換を、次の使われていない引き数ではなく、 n 番目の引き数に適用することを表します。 引き数は %n$ 指定子で何回も参照することができます。 % と %n$ で始まる 2 つのタイプの変換指定子を、1 つの format 文字列の中で一緒に使うことはできません。 番号付けされた引き数指定子を使うとき、N
番目の引き数を指定すると、すべての先行する引き数を最初から N-1 番目までフォーマットつき文字列内に指定することが必要です。
1 つのフォーマット文字列に番号付き引き数と番号なし引き数を混在させて指定した場合の結果は、定義されていません。 % または %n$ の後には次のものが順番に続きます。 | 1. | | 変換指定子の意味を修飾する 0 個以上の flags。 | | 2. | | 最小の field width (フィールドの幅) をバイト単位で指定するオプションの文字列の 10 進数数字。
変換した値の文字数が指定した field width に満たない場合、 field width の左に空白が埋め込まれて (後で説明する左揃えフラグ
(-) が指定されているときは右に空白が埋め込まれて)
表示されます。 field width を指定する数が 0 で始まっていると、左側に 0 が埋め込まれて右揃えになります
(下記のゼロ先行フラグ 0 を参照してください)。 | | 3. | | 変換のタイプが d, i, o, u, x, X のいずれかのときは最小桁数、 a, e または f のときは小数点キャラクタ以下の桁数、 g のときは有効桁の最大値、 s のときは文字列からプリントするバイトの最大値を指定する precision (精度)。 precision は、ピリオド の後に 10 進数数字文字列を記述して表します。null
数字文字列はゼロとして扱われます。 | | 4. | | 英文字の l。 これはオプションで、変換タイプが d, i, o, u, x, X のいずれかの場合は、 arg が long 整数であることを示します。 このとき変換タイプが n の場合は、 arg が long 整数へのポインターであることを示します。 または h、
これもオプションで、変換タイプが d, i, o, u, x, X のいずれかの場合は、 arg が short 整数であることを示します。 変換タイプが n の場合は、 arg が short 整数へのポインターであることを示します。
または hL、 これもオプションで、変換タイプが a, e, f, g のいずれかの場合は、 arg が extended 型 (Itanium アーキテクチャでの
80 ビットの IEEE-754 double-extended 型) であることを示します。
または ll、 これもオプションで、変換タイプが d, i, o, u, x, X のいずれかの場合は、 arg が long long 整数であることを示します。 あるいは L、
これもオプションで、変換タイプが a, A, e, E, f, g, G のいずれかの場合、 arg が長倍精度浮動小数点数であることを示します。 l, h, ll L が他の変換指定文字の前に現れた場合は無視されます。 | | 5. | | 変換のタイプを表す文字。 |
field width および precision は具体的な値の代わりにアスタリスク でも表せます。 この場合、 field width あるいは precision は整数の arg で与えられます。 実際に変換される arg は変換指定文字の後に位置すると解釈されています。つまり、 field width または precision あるいはその両方を指定する 場合は、変換対象の arg よりも前に指定しなければなりません。 field width に負の値を指定すると、それは - フラグとフィールド幅を表わす正の数値の組み合わせと解釈されます。 precision に負の値を指定すると、 precision は指定していないものとみなされます。 %n$ 変換指定子を含むフォーマット文字列も *n$ 指定で field width あるいは precision を表せます。 n は整数の値を持つ arg の位置を表します。 *n$ 指定では、 field width あるいは precision を指定する arg は、変換対象の arg の前後どちらにでも置くことができます。 フラグ文字とその意味を以下に示します。 | ' | | 10 進数変換 (%i, %d, %u, %f,%g, または %G) の結果の整数部分は、3 桁ごとにグルーピング文字でフォーマットされた書式にする。
何千ものグルーピングと区切り文字がある場合は、それぞれ LC_NUMERIC カテゴリの
"grouping" フィールドと "thousands_sep" フィールドによって決定されます
(localedef(4) を参照)。 他の変換に対して、動作は定義されていません。
通貨以外のグルーピング文字が使用されます。 | | - | | 変換した結果の値をフィールド内で左詰めにする。 | | + | | 符号付きの変換の結果の値に必ず符号 (+ または -)
を付ける。 | | ブランク | | 符号付きの変換結果の値の最初の文字が符号ではない場合、1 文字の空白を付加する。
したがって、ブランクフラグと + フラグの両方が指定された場合は、ブランクフラグは無視されます。 | | # | | このフラグは値を「代替形式」に変換します。 変換タイプが c, d, i, s, n, u のいずれかのときはこのフラグは意味がなく、 o のときは結果の精度を高くして 1 桁目が必ず 0 になるようにし、 x または X のときは 0 以外の結果に 0x または 0X が付加され、 p のときは 0 以外の結果に 0x が付加され、 a, A, e, E, f, g, G のいずれかのときは、結果の値は、小数部に値がなくても必ず小数点キャラクタを含むことになります
(通常は小数部に数字がある場合にのみ小数点キャラクタが出力されます)。
変換タイプが g または G の時、小数部内の後方の 0 はそのまま出力されます
(通常は除去されます)。 | | 0 | | (符号または基底表示の前に) 0 を付加すると、すべての変換タイプについて field width を 0 で埋めます。 空白の埋め込みは行われません。 0 と - の両方が指定された場合は、 0 フラグは無視されます。
変換タイプが d, i, o, u, p, x, X,
のいずれかの場合は、精度が指定されていれば、 0 フラグは無視されます。 |
変換タイプを指定する文字とその意味を以下に示します。 | d,i,o,u,x,X | | 整数値である arg を (d または i の時)
符号付きの 10 進数に、 (o の時) 符号なし 8 進数に、
(u の時)10 進数に、 (x または X の時)16 進数に、それぞれ変換します。
変換タイプ x では英文字 abcdef が、 X では英文字 ABCDEF が使われます。 precision で表示される桁数の最小値を指定します。変換された値をそれより少ない桁数で表示できる場合、値の先頭に 0 が付加されます。
(旧バージョンとの互換性を考慮して、この 0 を詰める指定は field width を指定する値の前に 0 を付加することでも行えます。
これは field width の値が 8 進数であることは意味しません)。 precision のデフォルト値は 1 です。 precision が 0 の場合に 0 という値を変換した結果は null 文字列になります。 | | f | | 倍精度数の arg を [-]dddrddd という形式の 10 進数に変換します。 ここで r は小数点キャラクタです。 小数点キャラクタの後ろの桁数は、 precision として指定した値と等しくなります。 precision が省略された場合は小数部の長さは 6 桁になります。 precision に 0 を指定したときは、小数点キャラクタは表示されません。 | | e,E | | 倍精度数の arg を、 [-]drddde±ddd という形式に変換します。ここで、 r は小数点キャラクタです。
小数点キャラクタの前は 1 桁、後ろの桁数は precision として指定した値と等しくなります。 precision を省略した場合は、小数部の長さは 6 桁になります。 precision に 0 を指定した場合は小数点キャラクタは表示されません。 E フォーマットコードは指数部の前の文字を e の代わりに E にします。
指数部の最小の長さは 2 桁です。 | | g,G | | 倍精度数の arg を、 f または e (G フォーマットコードの場合は E)
形式でプリントします。 precision に指定した値が有効桁数になります。 形式は変換された値によって決まります。つまり、指数部の値が -4 より小さいか、または precision の値以上のときは e が選ばれます。
小数部内の後方のゼロは除去されます。また小数点キャラクタはそれより下に数字があるときだけ表示されます。 | | a,A | | Itanium(R) ベース システム専用。 倍精度の arg を、 [-]0xhrhhhp±d という形式に変換します。
ここで r は小数点キャラクタです。 小数点キャラクタの前は 1 桁、後ろの桁数は precision として指定した値と等しくなります。 precision を省略した場合、 double では 13
桁、 extended では 15 桁、 long double では
28 桁になります (値を正確に表現するには、この桁数で十分です)。 precision に 0 を指定した場合は、小数点キャラクタは表示されません。 a を指定した場合の変換では、英字 abcdef が使われ、 A を指定した場合の変換では、英字 ABCDEF が使われます。 A 変換指定子では、 x と p の代わりに X と P を使って数が表示されます。
指数部は少なくとも 1 桁表示され、それ以上必要なときは、指数 (2 を基数としたべき乗数)
を 10 進数で表現するのに必要なだけの桁数で表示されます。 値が 0 の場合は、指数は 0 になります。 | | c | | 整数値の arg を符号なし文字に変換し、結果の文字をプリントします。 l (エル)
修飾子が存在する場合には、 wchar_t arg は、 LC_CTYPE の設定に従って 1 つのワイドキャラクタを表すバイトの配列に変換されます。
結果のバイトがプリントされます。 field width が小さくてワイドキャラクタが分けられるようであれば、ワイドキャラクタをプリントして、 field width はそれに合うように大きくされます。 _INCLUDE__STDC_A1_SOURCE のみ l (エル) 修飾子が存在する場合、引き数 wint_t は ls 変換指定を使ったかのように、精度を指定せず、2 つの要素からなる型 wchar_t を指し示す引き数を指定して変換されます。この 2 つの要素とは、 ls 変換指定に対する wint_t 引き数を含む要素と、null
ワイドキャラクタを含む要素です。 | | C | | lc と同じです。 | | s | | arg は文字列 (文字ポインター) であるものとし、文字列内から
null 文字 (\0) を検出するまで、もしくは precision で指定した数の文字をプリントします。 precision が省略されると無限とみなされ、最初の null 文字までの文字がプリントされます。 arg が NULL のとき結果は保証されません。 l (ell) 修飾子が存在する場合、引き数は型 wchar_t の配列へのポインターでなければなりません。
この配列のワイドキャラクタは、終端 null ワイドキャラクタまで (これを含む)
変換されます (各文字は wcrtomb() 関数を呼び出したかのように変換され、変換状態は、最初のワイドキャラクタが変換される前にゼロに初期化された mbstate_t オブジェクトによって記述されます)。結果として生成される文字は終端
null キャラクタ (バイト) の直前まで書き込まれます。 精度が指定されない場合は、配列に null ワイドキャラクタを 1 つ含める必要があります。精度が指定される場合は、これ以上の文字
(バイト) は書き込まれず (シフトシーケンスがある場合には、それも含む)、精度によって設定された文字シーケンス長と等価にするために、関数が配列直後のワイドキャラクタにアクセスする必要がある場合には、配列に
null ワイドキャラクタを 1 つ含めなければなりません。どちらの場合にも、部分文字の書き込みは行われません。 | | S | | ls と同じです。 | | p | | void 型のへのポインター arg の値が連続する符号なし 16 進数としてプリントされます。 precision は表示される最小の桁数を指定します。変換した値をそれよりも少ない桁数で表示できる場合は、値の先頭にゼロが付加されます。 precision のデフォルト値は 1 です。 precision が 0 のときに 0 という値を変換すると、結果は null 文字列となります。 | | n | | arg は整数へのポインターとみなされます。 このポインターは、この関数の呼び出しで、それまでに出力ストリームにプリントされたバイト数を書き込むために使われます。
引き数の変換は行われません。 | | % | | % をプリントし、引き数の変換は行いません。
変換指定全体が %% でなければなりません。 |
field width に値が指定されていなかったり小さすぎたりしても、変換結果の値が切り捨てられることはありません。結果の値が field width よりも長いときは、結果を含むようにフィールドは拡張されます。 変換タイプを指定する文字が a、 e、 f および g である場合、無限大のときは inf を、
静的な、およびシグナル表現の NaN 値は nan をプリントします。 変換タイプを指定する文字が A、 E および G である場合、無限大には INF を、
静的な、およびシグナル表現の NaN 値は NAN をプリントします。変換タイプを指定する文字として新しく設定された F は、 f と同じですが、無限大と NaN をそれぞれ INF および NAN としてプリントする点が異なります。 Itanium ベース システムの場合、変換タイプとして a、 A を指定すると、値は、指定した precision の 16 進浮動小数点数に正しく丸められます。 Itanium ベース システムの場合、変換タイプとして e, E, f, g, G を指定すると、ISO/IEC
C99 の仕様に従って丸められます。 つまり、10 進数での有効桁数が 36
桁以下であれば、結果は正しく丸められます。 printf() fprintf() で生成される文字は putc() を呼び出したときと同じようにプリントされます putc(3S) を参照)。 アプリケーション使用法_INCLUDE__STDC_A1_SOURCE 機能を使用するには、 _INCLUDE__STDC_A1_SOURCE フラグをコンパイラオプションとして引き渡すか、ソースファイルの中でマクロとして定義する必要があります。 printf() または fprintf() がストリームに適用された後で、そのストリームはバイト指向になります
(orientation(5) を参照)。 多言語化対応LocaleLC_CTYPE カテゴリには次の特徴があります。 フォーマット文字列内の普通の文字はシングルバイトまたはマルチバイト、あるいはその両方の文字として解釈されます。 field width はバイト単位で指定します。 文字が出力ストリームに送られると、シングルバイトまたはマルチバイト文字として解釈され、 field width からその文字の長さが引かれます。 precision はバイト単位で指定します。 文字が出力ストリームに送られると、シングルバイトまたはマルチバイト文字として解釈され、 precision からその文字の長さが引かれます。 戻り値はバイト単位で与えられます。 文字が出力ストリームに送られると、シングルバイトまたはマルチバイト文字として解釈され、戻り値となるそれまでに送られたバイト数がその文字の長さが増やされます。
LC_NUMERIC カテゴリは浮動小数点数のプリントで使う小数点キャラクタを決定します。
また、グルーピングフラグ ' がオンの場合、3 桁ごとのグルーピング文字を決定します。 サポートされるコードセットシングルバイト文字コードセットがサポートされています。 マルチバイト文字コードも、上で述べた LC_CTYPE カテゴリで表現される形でサポートされています。 戻り値それぞれの関数は送出したバイト数を返します (sprintf() については \0 は含みません)。
エラーが発生したときは負の値を返します。 エラーprintf(), fprintf() は
stream がバッファリングされていないか、 stream のバッファーを掃き出す必要があって write() を実行するときにはエラーが発生します write(2) を参照してください)。 その他に次のような場合があります。 | [EAGAIN] | | O_NONBLOCK フラグが stream であるファイル記述子に設定されていて、書き出し処理の際にプロセスが遅延させられている場合 | | [EBADF] | | stream であるファイル記述子が正しい書き出し用のファイル記述子でない場合 | | [EFBIG] | | プロセスのファイルサイズ上限またはファイルサイズの最大値を越えてファイルに書き出そうとした場合 ulimit(2) を参照してください) | | [EINTR] | | write() システムコールの間にシグナルを受け取った場合 | | [EIO] | | プロセスがバックグラウンド プロセスグループにあって制御ターミナルに書き出そうとしたとき、 TOSTOP が設定されていて、プロセスが SIGTTOU シグナルを無視またはブロックせずに、プロセスのプロセスグループが親なしの場合 | | [ENOSPC] | | ファイルの存在するデバイスに空きスペースが残っていない場合 | | [EPIPE] | | 読み出しのためにプロセスでオープンされていない パイプ
または FIFO に書き出そうとしたとき。 SIGPIPE シグナルがプロセスに送られた場合 | | [EILSEQ] | | 入力ストリームから取得したデータは、有効なワイドキャラクタを構成しません。 | | [ENOMEM] | | 使用可能な記憶領域が不足しています。 |
さらに別の errno の値が write() 関数によって設定されます write(2) を参照)。 例「Sunday, July 3, 10:02」という形式で日付と時間をプリントする場合、 weekday と month が null で終わる文字列へのポインターとすると次のようになります。 printf("%s, %s %d, %d:%.2d", weekday, month, day, hour, min); を小数点以下 5 桁までプリントするには次のようになります。 printf("pi = %.5f", 4 * atan(1.0)); 日付と時刻をプリントするルーチンを言語依存せずに表す場合、次のように書きます。 printf(format,weekday,month,day,hour,min,2,2); アメリカ式にするには、 format を次のような文字列へのポインターにするとよいでしょう。 "%1$s, %2$s %3$d, %4$*6$.*7$d:%5$*6$.*7$d" 出力結果は次のようになります。 ドイツ式にするには、次のような文字列を使います。 "%1$s, %3$s %2$d, %4$*6$.*7$d:%5$*6$.*7$d" 出力結果は次のようになります。 警告c 変換指定文字を使うと、整数の arg は符号なし文字型に変換されます。 そのため、マルチバイト文字は単一の c 変換指定文字ではプリントされません。 s 変換指定文字の precision の指定はマルチバイト文字を切り捨てることがあります。 対応する引き数の型と一致しない変換文字を指定すると、無効なデータが返されます。たとえば d, i, o, u, x, X 変換文字のどれかが、倍長精度整数型
(long long integer) の引き数に対して指定されている場合、適切な結果を得るには、 ll に修正する必要があります。 著者printf(), fprintf(), sprintf() は AT&T と HP で開発されました。 標準準拠printf(): AES, SVID2, SVID3, XPG2, XPG3,
XPG4, FIPS 151-2, POSIX.1, ANSI C fprintf(): AES, SVID2, SVID3, XPG2, XPG3,
XPG4, FIPS 151-2, POSIX.1, ANSI C sprintf(): AES, SVID2, SVID3, XPG2, XPG3,
XPG4, FIPS 151-2, POSIX.1, ANSI C
|