HOWTO · C

C の書式指定子

これは、C の printf 関数での書式指定子の構文と使用に関するガイドです。

このページの内容

この記事では、C 言語での printf 関数の使用と、この関数で使用される書式指定子について説明します。 この記事では、フォーマット指定子の構文と、それらがさまざまなデータ型にどのように使用されるかについて詳しく説明します。

最初に printf 関数の構文を見てみましょう。

C の printf() 関数の書式指定子

printf() 関数の構文は次のとおりです。

int printf(const char* format, ...);

この関数は、format 変数に格納されている文字列を標準出力コンソールに書き込みます。 この文字列にフォーマット指定子が含まれている場合、つまり、変数を指定するために % 記号で始まるサブ文字列が含まれている場合、これらは文字列の後に指定された値に置き換えられます。

パラメーター:

  • format

出力に書き込まれるテキストは、この C 文字列に格納されます。 必要に応じて、次の追加の引数で指定された値に置き換えられ、必要に応じてフォーマットされた埋め込みフォーマット指定子をオプションで含めることができます。

フォーマット指定子は次のパターンに従います。

%[flags][width][.precision][length]specifier

角括弧 [] は、これらの指定子がオプションであることを示します。 たとえば、printf("%lu",4294967295) は、4294967295 を符号なしの長い形式で出力することを意味します。

ここで、llong int の長さ指定子であり、uunsigned 数の指定子です。 残りのオプション引数は無視されます。

このパターンの最後の specifier は、出力されるデータのタイプを定義するため、最も重要な部分です。 さまざまな指定子とその説明のリストを次の表に示します。

指定子 説明
d または i 符号付き 10 進整数
u 符号なし 10 進整数
o 符号なし8進数
x 符号なし 16 進数
X 大文字の符号なし 16 進数
f 小文字の 10 進浮動小数点
F 大文字の 10 進浮動小数点
c キャラクター
s
a 小文字の 16 進浮動小数点
A 大文字の 16 進浮動小数点
p ポインタアドレス

指定子の前の残りのサブ指定子はすべてオプションですが、その目的は以下に定義されています。

フラグ:

フラグ 説明
- フィールドを左揃えにします。
+ 正の数の前にプラス記号を強制的に配置する
# それぞれ 0、0x、または 0X を配置するための 8 進数および 16 進数の指定子 (o、x、X) に使用されます。
0 値の左側に 0 を追加します。

幅:

説明
(number) 印刷する最小文字数を指定します。
* 幅は、フォーマット文字列ではなく、フォーマットされる引数の前に追加の整数値引数として指定されます。

精度:

精度 説明
.number 印刷する最小桁数を指定します。 数値の桁数が少ない場合は、左側にゼロが埋め込まれます。
.* 精度は、フォーマット文字列ではなく、フォーマットされる引数の前に追加の整数値引数として指定されます。

長さ:

長さ 説明
hh printf を指定して、整数型の char から拡張された int サイズの整数引数を想定します。
h printf を指定して、整数型の short から拡張された int サイズの整数引数を想定します。
l printf を指定して、整数型の long-sized 整数引数を想定します。 これは、浮動小数点型では無視されます。 varargs を使用すると、float 引数は自動的に double に昇格されます。
ll printf を指定して、整数型の長い大規模な整数引数を想定します。
L printf を指定して、浮動小数点型の long double 引数を想定します。
z 整数型の場合、printf を指定して、size_t サイズの整数引数を想定します。
j 整数型の場合、printf を指定して、intmax_t サイズの整数引数を想定します。
t 整数型の場合、printf を指定して、ptrdiff_t サイズの整数引数を想定します。
  • ...

関数は、フォーマット文字列 (または n の場合は格納場所へのポインター) に応じて、フォーマット文字列のフォーマット指定子を置き換える値を保持する追加の引数のシーケンスを期待する場合があります。

これらのパラメーターの数は、少なくとも、フォーマット指定子で示される値の数と等しくなければなりません。 関数は追加の引数を無視します。

戻り値:

操作が成功すると、書き込まれた文字の合計量が返されます。 エラー表示 (ferror) が設定され、書き込みエラーが発生した場合は負の整数が返されます。

Errno は EILSEQ に設定され、ワイド文字の書き込み中にマルチバイト文字エンコーディング エラーが発生した場合は負の整数が返されます。

例:

#include <stdio.h>

int main() {
  printf("Some Character values: %c %c \n", 'b', 66);
  printf("Some Decimal Value: %d %ld\n", 1234, 670000L);
  printf("Numbers preceeding with blank spaces: %10d \n", 1234);
  printf("Numbers preceeding with zeros: %010d \n", 1235);
  printf("Different number systems: %d %x %o %#x %#o \n", 100, 100, 100, 100,
         100);
  return 0;
}

出力:

Some Character values: b B
Some Decimal Value: 1234 670000
Numbers preceeding with blank spaces:       1234
Numbers preceeding with zeros: 0000001235
Different number systems: 100 64 144 0x64 0144