●C言語編 第40章 printf関数の詳細

'2010/1/9 浮動小数点数について少し補足。
'2007/3/25 練習問題の fgets() の引数を修正。

printf関数は、標準出力(通常は画面)に指定した文字を表示するライ ブラリ関数です。使用するには、stdio.hをインクルードする必要があります。printf関数は、次のような形式 になっています。

int printf(制御文字列, 引数のリスト);

「制御文字列」の部分に指定した文字列が表示されます。この文字列中にはフォーマット指定子と呼ばれる文字が 含まれる場合があります。フォーマット指定子については後述します。

「引数のリスト」は、フォーマット指定子の個数分だけ存在します。よって、存在しない場合もあります。

printf関数の戻り値は、実際に表示した文字数を返します。もしエラーが発生したら、負数を返すことになっています。 ただ、実際には戻り値をチェックする必要はまずないでしょう。

○フォーマット指定子

第6章で一部のフォーマット指定子を紹介しました。今回は、全てのフォーマット指定子を 紹介します。

フォーマット指定子意味
%d / %i符号付き10進整数
%u符号なし10進整数
%o符号なし8進整数
%x符号なし16進整数(小文字)
%X符号なし16進整数(大文字)
%f10進数の浮動小数点数
%e科学的記数法による浮動小数(小文字)
%E科学的記数法による浮動小数(大文字)
%g%fと%eの短い方
%G%fと%Eの短い方
%c文字
%s文字列
%pポインタ
%n出力された文字数を取得
%%%記号を出力

%d と %i は同じです。
%f は float型と double型の両方が含まれており、両者を区別する必要はありませんし、区別してはいけません。 long double型を扱うときには、%Lf と書きます。
%p は指定したポインタが保持しているアドレスを表示するために使います。
%n は対応する引数が整数の変数を指すポインタである必要があります。 そのポインタが指す変数に、これまでに出力した文字数の合計を格納します。

フォーマット指定子の数と同じだけ、printf関数は「引数のリスト」の部分に引数を持たなければなりません(%%だけは 例外。これは引数が不要)。フォーマット指定子の方が多いと正しく動作しません。逆に少ないと、余分な引数は出力には無関係 なものであると判断されます。ただしその場合に、引数が式の形式であったら、その式の処理は行います。そのため、次のような 場合、変数num2の値はインクリメントされます。

printf( "%d\n", num, num2++ );

○出力変換仕様

フォーマット指定子だけでも知っていれば最低限のことができます。しかし、printf関数の機能はこれだけではありません。 フォーマット指定の正確な書式は、次のようになっています。

%[フラグ][最小フィールド幅][精度][変換修飾子]フォーマット指定子

[]の部分は省略可能です。[]の付いていない部分だけを取り出すと、%フォーマット指定子 となります。これが最小の形 なのです。

○フラグ

「フラグ」は次のいずれかを使います。

フラグ意味
++-の符号付きで出力
空白正数のとき先頭に空白を付ける
-左詰めで出力
#表記法に従った形式で出力
0足りない桁に0を詰めて出力

「+」は数値の先頭に付く符号に関する指定です。「127」という数値を出力するとき、「+127」と「127」のどちらのスタ イルにするのかが指定できます。「+」を使えば「+127」、使わなければ「127」です。また「 」(空白)を指定すると、 「 127」というように先頭に空白を付けて出力します。

「+」があるので勘違いしそうですが、「-」は符号の指定とは無関係です。「-」は出力時に、文字を左詰めするように 指定します。これを指定しないと右に揃えて出力されます。

「#」は、8進表記(0)、16進表記(0x または 0X)といった特定の表記法に従って出力するように指定します。%#o指定で、 8進数の「32」を出力すると「032」と出力されます。

「0」は、後続の「最小フィールド幅」で指定した桁数に満たない部分に0を詰めるように指定します。

○最小フィールド幅

「最小フィールド幅」は、出力の桁数を指定します。10進数の整数または、「*」が指定できます。

10進数の整数を指定した場合は、その指定に従います。「*」を指定した場合は、フォーマット指定子と同様に、後続の 「引数のリスト」に引数を追加します。その引数はint型である必要があり、その値が桁数となります。この引数は、「引数 のリスト」の中でも最も左端に置きます。

指定された桁数に満たない場合は、右端に揃えて表示され、足りない左側には空白が詰められます。もちろん、前述したよう に、「フラグ」で「0」を指定していれば、左側には0が詰められます。また、「-」を指定していれば、左側に揃えて表示され ます。

最小フィールド幅には、0は使えません。0は「フラグ」として認識されます。また、負数を指定すると、先頭の「-」の部分は 「フラグ」の「-」として認識されることになります。よって「-4」と指定すると、左詰めの4桁表記となります。

○精度

「精度」は、フォーマット指定子の種類によって、意味合いが異なります。「%d」「%x」「%u」といった整数出力では、 最小の桁数。「%f」「%e」では、小数点以下の桁数。「%g」では、最大有効桁数。「%s」では、出力される最大バイト数。 となります。他のフォーマット指定子の場合は、正しい動作を保証しません。

「精度」には、「.」を書き、その直後に10進数の整数か「*」を書きます。あるいは「.」だけでも有効です。「.*」の 場合は、「最小フィールド幅」と同様に、「引数のリスト」に引数を追加する必要があります。また、「.」だけの場合は、 「.0」を指定したのと同じ意味になります。

○変換修飾子

「変換修飾子」には、「h」「l」「L」のいずれかを指定できます。

これらは定数に付けるサフィックスやプリフィックスと同じ意味です。 「h」はshort、 「l」は int や unsinged に対する long指定、 「L」は double に対する long の指定(すなわち long double型)です。

フォーマット指定子の指定と一致しない場合は、正しい動作を保証しません。



練習問題

問題@ キーボードから10文字以内の文字列を入力させ、最初の7文字まで表示させるプログラムを作って下さい。

問題A 0000〜1000の数字コードの連番を、4桁表記で出力するプログラムを作って下さい。

問題B 3.141592という浮動小数の出力を、小数点以下の表示桁数0から8までの9パターンを試すプログラムを 作って下さい。for文によるループを利用して、1つのprintf関数だけで9パターン全て出力するようにして下さい。

解答ページへ


C言語編のトップページに戻る

サイトのトップページに戻る