C の書式指定子

Muhammad Husnain 2023年10月12日
C の書式指定子

この記事では、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
Muhammad Husnain avatar Muhammad Husnain avatar

Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.

LinkedIn