Printf
[Wikipedia|▼Menu]

printf(プリントエフ)は、C言語標準ライブラリに属し、ヘッダー (stdio.h) で宣言されている関数である。引数で与えられた書式付きの文字列を、環境によって設定された標準出力 (stdout) に出力する。その機能はJIS X 3010:2003においてprintf関数は,与えられた実引数の前にstdoutを実引数として付加したfprintf関数と等価とする。と規定されている (7.19.6.3)。

この関数は、第1引数に与えられた文字列を出力する。C言語の他の単純な入出力関数に比べ、比較的複雑な構造を持っており、第1引数の文字列のなかで書式を指定することで、第2引数以降の任意の数の引数(可変長引数)を、書式に従って出力することができる。また、整数型(int型)の戻り値を持ち、出力に成功した場合には転送したバイト数、出力に失敗した場合には負数を返却する。
形式#include <stdio.h>int printf(const char * restrict format, ...);
書式化文字列

上記形式における第一引数には、それに続く実引数の変換方法を指定する。書式化文字列には、通常のマルチバイト文字または%で始まる変換指定のいずれかの指令を0個以上含む。マルチバイト文字が含まれ、かつ文字コードがシフトシーケンスに依存する場合には、書式化文字列は初期シフト状態で始まり、初期シフト状態で終わらなければならない。書式指定を行う%?それぞれを書式指定子と呼ぶ。
変換指定

変換指定は次の形式をとる。([ ]内は省略可能)%[引数順][フラグ][最小フィールド幅][.精度][長さ修飾子]変換指定子
引数順 (POSIX)

これは標準C規格の仕様ではなく、POSIXで規定されている拡張である。

書式文字列において%の代わりに%m$を記述することで、続く可変長引数のうちどれを使うかを番号mで指定できる。例えば、const char* fmt = "Invalid command %1$s at line %2$d.\n";const char* cmd = "hoge";const int lineNumber = 20;printf(fmt, cmd, lineNumber);

とした場合、Invalid command hoge at line 20.

と表示される。これだけならば大きな意味はないが、例えばメッセージを翻訳(ローカライズ)する際、const char* fmt = "%2$d行目のコマンド %1$s は不正です。\n";

というように書式文字列だけをローカライズする[1]ことで、可変長引数の指定順を変更せずに、20行目のコマンド hoge は不正です。

という自然な語順の出力を得ることができる[2]
フラグ

変換指定のフラグは以下の通り。

フラグ意味
-フィールドの左寄せ
+常に符号を出力
空白数値が正または 0 の場合は符号の代わりに空白を出力
#代替形式。基数を表すプレフィックスの出力等
0出力文字数が最小フィールド幅未満の場合は'0'を出力

長さ修飾子

修飾子意味導入バージョン
hh実引数は char 型C99以降
h実引数は short 型全バージョン
l(エル)実引数は long 型または wchar_t 型または double 型
[3]wchar_t についてはC95以降、double についてはC99以降
ll(エルエル)実引数は long long 型C99以降
j実引数は intmax_t 型C99以降
z実引数は size_t 型C99以降
t実引数は ptrdiff_t 型C99以降
L実引数は long double 型全バージョン

変換指定子

指定子意味導入バージョン
d, i10進符号付き整数全バージョン
u10進符号無し整数全バージョン
o8進符号無し整数全バージョン
x, X16進符号無し整数( X は大文字で出力)全バージョン
e, E指数形式浮動小数点数( E は大文字で出力)全バージョン
f, F小数形式浮動小数点数( F は大文字で出力)全バージョン
g, Ge または f 形式のうち適した方( G は大文字で出力)全バージョン
a, A16進浮動小数点( A は大文字で出力)C99以降
c文字全バージョン
s文字列全バージョン
pポインタの値全バージョン
n整数変数に出力済み文字数を格納全バージョン
%'%'の出力全バージョン

関連する関数
fprintf

fprintfは、引数にファイルポインタfpが追加され、標準出力の代わりにfpへ出力する変種である。#include <stdio.h>int fprintf(FILE * restrict fp, const char * restrict format, ...);
sprintf, snprintf

sprintfとsnprintfは、引数にchar配列の要素へのポインタstrが追加されたもので、標準出力の代わりにstrへ出力する変種である。snprintfは、さらにstrに書き込んで良い文字数を指定する引数が追加されたものであるが、Cの標準規格に収録されたのはC99からである。#include <stdio.h>int sprintf(char * restrict str, const char * restrict format, ...);int snprintf(char * restrict str, size_t size, const char * restrict format, ...);
wprintf, fwprintf, swprintf

wprintf, fwprintf, swprintfは、それぞれprintf, fprintf, snprintfに対応し、ワイド文字を使用するものである。sprintfに対応するワイド文字関数(出力バッファサイズを受け取らない関数)は存在しない[4]。#include <stdio.h>int wprintf(const wchar_t * restrict format, ...);int fwprintf(FILE * restrict fp, const wchar_t * restrict format, ...);int swprintf(wchar_t * restrict str, size_t size, const wchar_t * restrict format, ...);
va_listを引数に取るもの

ここまでに挙げたprintfとその変種に対して、可変個引数部分をva_listに変化させた種類が存在する。それぞれ、関数名の頭にvを付けた名称となっている。#include <stdio.h>int vprintf(const char * restrict format, va_list args);int vfprintf(FILE * restrict fp, const char * restrict format, va_list args);int vsprintf(char * restrict str, const char * restrict format, va_list args);int vsnprintf(char * restrict str, size_t size, const char * restrict format, va_list args);int vwprintf(const wchar_t * restrict format, va_list args);int vfwprintf(FILE * restrict fp, const wchar_t * restrict format, va_list args);int vswprintf(wchar_t * restrict str, size_t size, const wchar_t * restrict format, va_list args);
安全性を向上させたもの

C11のAnnex K Bounds‐checking interfacesで規定された、安全性を向上させた種類が存在する。それぞれ、関数名の末尾に_sを付けた名称となっている。これらの関数は、__STDC_WANT_LIB_EXT1__を1に定義した上で対応するヘッダをインクルードすると宣言される。#define __STDC_WANT_LIB_EXT1__ 1#include <stdio.h>#include <wchar.h>int printf_s(const char * restrict format, ...);int fprintf_s(FILE * restrict fp, const char * restrict format, ...);int sprintf_s(char * restrict str, rsize_t size, const char * restrict format, ...);int snprintf_s(char * restrict str, rsize_t size, const char * restrict format, ...);int vprintf_s(const char * restrict format, va_list arg);int vfprintf_s(FILE * restrict fp, const char * restrict format, va_list arg);int vsprintf_s(char * restrict str, rsize_t size, const char * restrict format, va_list arg);int vsnprintf_s(char * restrict str, rsize_t size, const char * restrict format, va_list arg);int wprintf_s(const wchar_t * restrict format, ...);int fwprintf_s(FILE * restrict fp, const wchar_t * restrict format, ...);int swprintf_s(wchar_t * restrict str, rsize_t size, const wchar_t * restrict format, ...);int snwprintf_s(wchar_t * restrict str, rsize_t size, const wchar_t * restrict format, ...);int vwprintf_s(const wchar_t * restrict format, va_list arg);int vfwprintf_s(FILE * restrict fp, const wchar_t * restrict format, va_list arg);int vswprintf_s(wchar_t * restrict str, rsize_t size, const wchar_t * restrict format, va_list arg);int vsnwprintf_s(wchar_t * restrict str, rsize_t size, const wchar_t * restrict format, va_list arg);

以下のような機能が追加されている。

FILE*や文字列の引数(%sに対応する可変長引数部分の引数も含む)に対するNULLポインタチェック


次ページ
記事の検索
おまかせリスト
▼オプションを表示
ブックマーク登録
mixiチェック!
Twitterに投稿
オプション/リンク一覧
話題のニュース
列車運行情報
暇つぶしWikipedia

Size:22 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)
担当:undef