コンテンツにスキップ
メインメニュー
メインメニュー
サイドバーに移動
非表示
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
特別ページ
Wikippe
検索
検索
表示
ログイン
個人用ツール
ログイン
Printfのソースを表示
ページ
議論
日本語
閲覧
ソースを閲覧
履歴を表示
ツール
ツール
サイドバーに移動
非表示
操作
閲覧
ソースを閲覧
履歴を表示
全般
リンク元
関連ページの更新状況
ページ情報
表示
サイドバーに移動
非表示
←
Printf
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
要求した操作を行うことは許可されていません。
このページのソースの閲覧やコピーができます。
{{小文字|title=printf}} {{Wikibooks|C言語/標準ライブラリ/入出力#printf関数|C言語}} '''printf'''(プリントエフ、'''print f'''ormatted)は、[[C言語]]の標準入出力ヘッダー (<stdio.h>)で宣言されている[[関数 (プログラミング)|関数]]である。引数で与えられた書式付きの文字列を、環境によって設定された[[標準出力]] (stdout) に出力する。JIS X 3010:2003においてその機能は「[[引数|実引数]]にstdoutを実引数として付加したfprintf関数と等価とする」と規定されている (7.19.6.3)。 この関数は、第1引数に与えられた文字列を出力する。C言語の他の単純な入出力関数に比べ、比較的複雑な構造を持っており、第1引数の文字列のなかで書式を指定することで、第2引数以降の任意の数の引数を、書式に従って出力することができる。また、[[整数型]](int型)の戻り値を持ち、出力に成功した場合には転送したバイト数、出力に失敗した場合には負数を返却する。 C言語の初心者の大半が最初に使う関数であり、最もオーソドックスかつ使いやすい関数ではあるが、内部では指定された書式を考慮する高級な処理を行っているため、ハードウェアの許容限界まで負荷がかかるシステムや組み込み機器のプログラミングにおいてはあまり使用されることのない関数である。 == 形式 == <source lang="c"> #include <stdio.h> int printf(const char * restrict format, ...); </source> == 書式化文字列 == 上記形式における第一引数formatは、それに続く実引数の変換方法を指定する。書式化文字列には、通常の[[マルチバイト文字]]または'%'で始まる変換指定のいずれかの指令を0個以上含む。多バイト文字が含まれ、かつ[[文字コード]]が[[シフトシーケンス]]に依存する場合には、書式化文字列は初期シフト状態で始まり、初期シフト状態で終わらなければならない。書式指定を行う''%〜''それぞれを書式指定子と呼ぶ。 === 変換指定 === 変換指定は次の形式をとる。([ ]内は省略可能) %[引数順][フラグ][最小フィールド幅][.精度][長さ修飾子]変換指定子 === 引数順 === 引数順指定が存在するときは数値の後ろに'$'が入る。 char *fmt = "Invalid Command %1$s at line %2$d.\n"; printf(fmt, cmd, lineno); で、cmdが hoge linenoが20だった場合、 Invalid Command hoge at line 20 と表示される。これだけならば大きな意味はないが、メッセージを翻訳した際、char *fmtに "%2$d行目のコマンド %1$sは不正です" が入っている状態にすることで、プログラムを変更せずに 20行目のコマンドhogeは不正です のように自然な語順に翻訳することができる。これはCの規格ではなくPOSIXで規定されている。 === フラグ === 変換指定のフラグは以下の通り。 {| class="wikitable" !フラグ!!意味 |- | - ||フィールドの左寄せ |- | + ||常に符号を出力 |- | 空白 ||数値が正または 0 の場合は符号の代わりに空白を出力 |- | # ||代替形式。基数を表すプレフィックスの出力等 |- | 0 ||出力文字数が最小フィールド幅未満の場合は'0'を出力 |} === 長さ修飾子 === {| class="wikitable" !修飾子!!意味!!導入バージョン |- |hh||実引数は char 型||C99以降 |- |h||実引数は short 型||全バージョン |- |l(エル)||実引数は long 型または wchar_t 型または double 型||wchar_t についてはC95以降、double についてはC99以降 |- |ll(エルエル)||実引数は long long 型||C99以降 |- |j||実引数は intmax_t 型||C99以降 |- |z||実引数は size_t 型||C99以降 |- |t||実引数は ptrdiff_t 型||C99以降 |- |L||実引数は long double 型||全バージョン |} === 変換指定子 === {| class="wikitable" !指定子!!意味!!導入バージョン |- |d, i||10進符号付き整数||全バージョン |- |u||10進符号無し整数||全バージョン |- |o||8進符号無し整数||全バージョン |- |x, X||16進符号無し整数( X は大文字で出力)||全バージョン |- |e, E||指数形式浮動小数点数( E は大文字で出力)||全バージョン |- |f, F||小数形式浮動小数点数( F は大文字で出力)||全バージョン |- |g, G|| e または f 形式のうち適した方( G は大文字で出力)||全バージョン |- |a, A||16進浮動小数点( A は大文字で出力)||C99以降 |- |c||文字||全バージョン |- |s||文字列||全バージョン |- |p||ポインタの値||全バージョン |- |n||整数変数に出力済み文字数を格納||全バージョン |- |%||'%'の出力||全バージョン |- |} == 関連する関数 == === fprintf === fprintfは、引数にファイルポインタfpが追加され、標準出力の代わりにfpへ出力する変種である。 <source lang="c"> #include <stdio.h> int fprintf(FILE * restrict fp, const char * restrict format, ...); </source> === sprintf, snprintf === sprintfとsnprintfは、引数にchar配列の要素へのポインタstrが追加されたもので、標準出力の代わりにstrへ出力する変種である。snprintfは、さらにstrに書き込んで良い文字数を指定する引数が追加されたものであるが、Cの標準規格に収録されたのは[[C99]]からである。 <source lang="c"> #include <stdio.h> int sprintf(char * restrict str, const char * restrict format, ...); int snprintf(char * restrict str, size_t size, const char * restrict format, ...); </source> === wprintf, fwprintf, swprintf === wprintf, fwprintf, swprintfは、それぞれprintf, fprintf, snprintfに対応し、[[ワイド文字]]を使用するものである。sprintfに対応するワイド文字関数は存在しない。 <source lang="c"> #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, ...); </source> === va_listを引数に取るもの === ここまでに挙げたprintfとその変種に対して、可変個引数部分をva_listに変化させた種類が存在する。それぞれ、関数名の頭にvを付けた名称となっている。 <source lang="c"> #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); </source> === 安全性を向上させたもの === [[C11 (C言語)|C11]]のAnnex K Bounds‐checking interfacesで規定された、安全性を向上させた種類が存在する。それぞれ、関数名の末尾に_sを付けた名称となっている。これらの関数は、__STDC_WANT_LIB_EXT1__を1に定義した上で対応するヘッダをインクルードすると宣言される。 <source lang="c"> #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); </source> 以下のような機能が追加されている。 * FILE*や文字列の引数(%sに対応する可変長引数部分の引数も含む)に対するNULLポインタチェック * %n書式の禁止 == コード例 == <source lang="c"> #include <stdio.h> int main(void) { int a = 1234; printf("%d %o %x\n", a, a, a); printf("%s %c\n", "abc", 'x'); return 0; } </source> 上記のコードをコンパイルし実行すると、次の出力が得られる。 1234 2322 4d2 abc x == 脆弱性 == {{see|書式文字列攻撃}} 一般に、書式文字列を外部や利用者から自由に指定できる状態とすることは[[セキュリティホール]]の温床となるため望ましくない。特に%n書式を用いたものが有名である<ref>{{Cite web|url=http://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/c906.html|title=第10章 著名な脆弱性対策 フォーマット文字列攻撃対策|work=IPA ISEC セキュア・プログラミング講座:C/C++言語編|publisher=独立行政法人 情報処理推進機構|accessdate=2012-07-03}}</ref>。 == 他言語 == C言語から派生した[[C++]]や[[D言語]]はもとより、[[PHP: Hypertext Preprocessor|PHP]]<ref>{{cite web | url=http://php.net/manual/ja/function.printf.php | title=PHP: printf | work=[http://www.php.net/manual/ja/index.php PHPマニュアル] | date=2013-03-22 | accessdate=2013-03-28}}</ref>、[[Ruby]]<ref>{{cite web | url=http://doc.ruby-lang.org/ja/1.9.3/method/Kernel/m/printf.html | title=Kernel.#printf | work=[http://doc.ruby-lang.org/ja/1.9.3/doc/index.html Ruby1.9.3リファレンスマニュアル] | accessdate=2013-03-28}}</ref>、[[Perl]]など他の言語でもprintfが実装されている。また、[[オブジェクト指向]]の言語の中には、C++での[[Boost]]::format<ref>{{cite web | url=http://www.boost.org/doc/libs/1_53_0/libs/format/doc/format.html | title=The Boost Format Library | date=2006-12-02 | accessdate=2013-03-28}}</ref>、Ruby<ref>{{cite web | url=http://doc.ruby-lang.org/ja/1.9.3/method/String/i/=25.html | title=Instance method String#% | work=[http://doc.ruby-lang.org/ja/1.9.3/doc/index.html Ruby1.9.3リファレンスマニュアル] | accessdate=2013-03-28}}</ref>、[[Python]]など[[演算子]]としてsprintfを実行できるものも存在する。 == 脚注 == {{reflist}} == 参考文献 == *JIS X 3010:2003 プログラミング言語C *{{PDFLink|[http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf N1570]}}(C11の最終ドラフト) == 関連項目 == *[[C言語]] *[[入出力]] *[[Hello world]] *[[scanf]] *[[書式文字列攻撃]] == 外部リンク == * UNIX コマンド ** [http://linuxjm.sourceforge.jp/html/gnumaniak/man1/printf.1.html printf(1)] man page GNU 版。JM Project ** [http://docs.sun.com/app/docs/doc/816-5165/printf-1?l=ja&a=view printf(1)] man page (Solaris 10 Reference Manual) {{En icon}} ** [http://docs.hp.com/ja/B2355-60128/printf.1.html printf(1)] man page(HP-UX リファレンス) * 標準 C ライブラリ ** [http://linuxjm.sourceforge.jp/html/LDP_man-pages/man3/printf.3.html printf(3)] JM Project ** [http://docs.sun.com/app/docs/doc/819-1213/printf-3c?l=ja&a=view printf(3C)] man page (Solaris 10 Reference Manual) ** [http://docs.hp.com/ja/B2355-60128/printf.3S.html printf(3S)] man page(HP-UX リファレンス) {{Unixコマンド}} [[Category:標準Cライブラリ]] [[Category:UNIXのソフトウェア]] {{Link GA|ru}} [[hu:Printf]]
このページで使用されているテンプレート:
テンプレート:Cite web
(
ソースを閲覧
)
テンプレート:En icon
(
ソースを閲覧
)
テンプレート:Link GA
(
ソースを閲覧
)
テンプレート:PDFLink
(
ソースを閲覧
)
テンプレート:Reflist
(
ソースを閲覧
)
テンプレート:See
(
ソースを閲覧
)
テンプレート:Unixコマンド
(
ソースを閲覧
)
テンプレート:Wikibooks
(
ソースを閲覧
)
テンプレート:小文字
(
ソースを閲覧
)
Printf
に戻る。
検索
検索
Printfのソースを表示
話題を追加