printf関数の基本的な使い方と整形表示(%dなどの書式指定文字列)について解説します。
C言語のprintf関数は最初に覚えておくと後々楽なので、ぜひマスターしましょう!
printf関数の機能を正確に言うと、標準出力装置へ出力するという機能を持ちます。
大抵のコンピュータシステムでは、標準出力装置がディスプレイ装置であるため、printf関数は画面に表示すると認識されています。C言語が動く環境であれば、標準出力装置としてハード側で設定されている装置が1行くらいの小さな液晶ディスプレイだったり、はたまたスピーカーであったりするかもしれません。ここがC言語の面白い所です。
printf関数の基本的な使い方
最初のプログラムで登場したprintf関数はこんな形でした。
/* 01intro.c 自己紹介する */
#include <stdio.h>
int main(void)
{
printf("はじめまして、織田信長です!\n趣味は戦争です。\n");
return 0;
}
これには printf関数の基本がつまっています。
printf関数の基本は次の形です。
printf();
このままでは何も起きません。通常は、( ) の中に文字列を指定できます。
C言語での文字列は “ (ダブルクォーテーション)でくくって表現します。
"Hello!"
画面に Hello! を出力するには、
printf("Hello!");
とします。
但し、このままだと次に何か表示を行った場合同じ行に表示してしまうため、通常は文字列の最後に改行を表す \n を入れて次のようにします。
printf("Hello!\n");
最初のプログラムに登場したprintf関数もこの形式に沿って記述されています。
printf("はじめまして、織田信長です!\n趣味は戦争です。\n");
上記のprintf関数には、文字列の中に改行を表す \n が2箇所あるため、実際の表示はこうなります。
はじめまして、織田信長です! 趣味は戦争です。
以上がprintf関数の基本です。
\ で始まる文字列をエスケープシーケンス文字と言います。 \ 自体は特殊文字のため、エスケープ文字と呼ばれています。エスケープシーケンス文字の代表的なものに \n(改行)、 \t(水平タブ)、\\( \ 1文字を表すために使う)などがあります。詳しくは、C初級:エスケープシーケンス文字をご覧ください。
printf関数で計算結果を表示する
コンピュータは計算機です。
printf関数ではその一旦を垣間見ることが出来ます。
次のプログラムを実行してみてください。
printf_keisan.c
#include <stdio.h>
int main(void)
{
printf("%d\n", 8+2);
return 0;
}
実行すると 8+2 の計算結果である 10 が画面に表示されます。
10
8+2 の部分を 4*3 や 10-8+5 のように他の計算式に置き換えてみてください。きちんと計算して表示してくれるはずです。
ここで printf関数のつづり について少し。
printf関数のつづりは print と f を組み合わせています。(なぜ print関数じゃないのだ??と思いませんか)
これは出力を意味する print と整形を意味する英語のフォーマット(Format)の頭文字 f を表しているからです。printf関数は、整形出力する命令ということになります。
上記のプログラムでは、文字列の中に %d という部分があります。これは書式指定文字列と言います。
printf("%d\n", 8+2);
printf関数の文字列に %d のような書式指定文字列を記述した場合、文字列 ” ~ “ の後の , 以降で指定した計算式や変数の値が %d の位置に表示されます。
イメージ
printf関数で整形表示してみる
先ほどのプログラムだと出力結果を整形している程でもないので、もうちょっと説明します。
例えば、
8 + 2 = 10
のように計算式も含めて表示したい場合はこんな風に記述します。
printf("8 + 2 = %d\n", 8+2 );
イメージ
ちょっと整形してる感が出てきました。
%d のような書式指定文字列は複数箇所記述できます。
printf("%d + %d = %d\n", 8, 2, 8+2);
%d の数と表示対象は数を合わせる必要があります。%d を記述した順番に , で区切って表示対象を指定します。
上記3つの %d は、後に続く 8, 2, 8+2 にそれぞれ対応しています。
これは変数を使って画面表示を行う場合も同様です。
変数 a, b, c の内容を画面に表示してみます。
int a = 2, b = 4, c = 8; printf("%d と %d と %d は偶数です\n", a, b, c);
表示結果
2 と 4 と 8 は偶数です
イメージ
更にprintf関数の整形機能を見ていきます。
桁揃えをして表示する
printf関数は、数値を複数行に表示した場合、桁揃えをして表示する際などに有効です。
次のプログラムを実行すると桁が階段状に表示されてしまい数値の表示としては少し違和感があります。
printf_soroenai.c
#include <stdio.h>
int main(void)
{
int x = 123, y = 1234, z = 12345;
printf("%d\n", x);
printf("%d\n", y);
printf("%d\n", z);
return 0;
}
実行結果
123
1234
12345
プログラムの %d の部分を %8d としてみてください。
printf_soroeru.c
#include <stdio.h>
int main(void)
{
int x = 123, y = 1234, z = 12345;
printf("%8d\n", x);
printf("%8d\n", y);
printf("%8d\n", z);
return 0;
}
実行結果
123 1234 12345
綺麗に右揃えで表示できました。
% と d の間の数値は表示する桁数を表します。%8d としたので、8桁で表示せよという意味です。
数値の場合、基本的に右揃えで表示してくれます。(ちなみに左揃えで表示したい場合は、数値の前に – をつけて %-8d とします)
整数のゼロ埋め(ゼロサプレス)表示
ゲームのスコア表示などでよくある
SCORE: 0090700
のようなゼロ埋め表示(ゼロサプレスとも呼ぶ)も可能です。
printf_zero.c
#include <stdio.h>
int main(void)
{
int score = 90700;
printf("SCORE: %07d\n", score);
return 0;
}
上記のように %07d とした場合、7桁で右揃え表示して空いた部分に 0 を挿入するという意味になります。
表示結果
SCORE: 0090700
実数の整形表示:小数点以下の表示桁を指定する
実数を使った小数点以下の表示についても見ていきます。
printf_float.c
#include <stdio.h>
int main(void)
{
double n = 123.45678;
printf("%f\n", n);
return 0;
}
実行結果
123.456780
float や double 型で定義される実数をprintf関数で表示する場合、書式指定文字列として %f を使うことになっています。
%f も %d 同様に表示桁を指定できます。全体の表示桁を指定できることはもちろんですが、小数点以下の表示桁数も別に指定できるようになっています。
printf関数の部分を次のように変更してみてください。
printf("%10.2f\n", n);
実行結果
123.46
%10.2f の 10 は表示する全体の文字数で、小数点の後の 2 は小数点以下何桁で表示するか?を表しています。
注意して欲しいのは小数点 . も全体の文字数に含まれる点です。また、小数点以下の桁数は四捨五入が適用されます。例えば %10.2f とした場合、小数点以下3桁目を四捨五入して小数点以下2桁で表示します。
イメージ
文字列の整形表示
char型配列で表現される文字列の整形表示についても見ていきます。
printf_str.c
#include <stdio.h>
int main(void)
{
char buf[] = "Orange";
printf("%s\n", buf);
return 0;
}
実行結果
Orange
char型配列などで表される文字列の表示には、書式指定文字列として %s を用います。
printf("%s\n", buf);
%10s とすると全体を右揃えで10文字で表示して、空いた位置に半角スペースが挿入されます。
Orange
また、 %10.4s などとすると先頭の4文字だけを10文字で表示します。
Oran
書式指定文字列一覧
printf関数で利用できる書式指定文字列の主なものをまとめてみました。
書式 | 出力形式 | 対応する変数型 |
---|---|---|
%d | 10進整数 | char short int long |
%hd | 10進整数(short型の場合に使用) | short |
%ld | 10進整数(long型の場合に使用) | long |
%u | 符号なし10進整数(unsigned型の場合に使用) | unsigned char unsigned short unsigned int unsigned long |
%o | 8進整数 | %dに同じ |
%x | 16進整数(%Xとすると大文字で表示) | %dに同じ |
%f | 10進実数 | float double |
%lf | 10進実数 | コンパイラのバージョンによっては double 基本的にはscanfで入力した数値を double型に格納する場合に使用 |
%c | 1バイト文字(半角1文字) | char |
%s | 1バイト文字またはマルチバイト文字の文字列 | char配列(char *) |
補足
%hd や %ld などは、実際には %d で代用することが多いです。(特にエラーが出るわけでもないので)
%o と %x(%X) は10進数をそれぞれ8進表示、16進表示したい場合に利用できます。
例)
printf("%o\n", a); /* 8進数で表示 */ printf("%x\n", a); /* 16進数で表示(a~fの小文字) */ printf("%X\n", a); /* 16進数で表示(A~Fの大文字) */
表示結果
12
a
A
書式指定文字列の種類や使い方についてはもっと沢山あるので、できれば一度調べてみることをお薦めします。
マイクロソフトのサイトなどが詳しいです。
以上、printf関数の基本的な使い方と整形表示の解説でした。
コメント