*printf関数 [#sfc4bfc3]
画面に出力するには、''printf関数''を使います。
printf関数は、標準入出力ライブラリーのヘッダー・ファイル ''stdio.h'' の中に定義されていて、このライブラリーを読み込まないと使えません。
ライブラリーを読み込むには、 ''#include'' を使い、''< >'' の中にヘッダー・ファイルの名前を指定します。
(ライブラリーについては、後日、詳しく勉強します。)
printfは、''print formatted''を表していて、書式付き出力という意味です。
printf関数は、( ) の中に出力する文字列を指定します。
#geshi(c){{
printf(文字列);
}}
変数の値を出力するときは、文字列の中に下で説明する''変換指定子''を入れておき、文字列の後にコンマで区切って変数の名前を指定します。
#geshi(c){{
printf(文字列, 変数1, 変数2, ...);
}}
*変換指定子 [#occ12f2a]
printf関数の中で書式(フォーマット)を指定するものを''変換指定子''といいます。
変換指定子は、''%'' の記号で始まる文字列で表されます。
**整数・小数を出力する [#q6a112fa]
整数を出力するときは ''%d''、小数を出力するときは ''%f''、小数を指数形式で出力するときは ''%e'' を変換指定子として用います。
たとえば、整数と小数を出力するプログラムは、次のようになります(プログラム1)。
#geshi(c){{
#include <stdio.h>
int main(void) {
int i = 12345;
double d = 123.456789;
printf("%d\n", i);
printf("%f\n", d);
printf("%e\n", d);
return 0;
}
}}
このプログラムを実行すると、次のようになります。
#geshi(sh){{
luna% a.out
12345
123.456789
1.234568e+02
}}
**演習1 [#p8a9f701]
プログラム1を作成し、実行結果を確認せよ。
**桁数を指定する [#z908f70f]
桁数は、''%桁数d'' の形で指定します(プログラム2、一部のみ)。
#geshi(c){{
int i = 12345, j = -987;
printf("%8d\n", i);
printf("%8d\n", j);
}}
#geshi(sh){{
luna% a.out
12345
-987
}}
小数の場合は、''%全体の文字数.小数点以下の桁数f'' の形で指定します。
全体の文字数を省略して、小数点以下の桁数だけでも指定できます(プログラム3、一部のみ)。
#geshi(c){{
double d = 123.456789, e = -98.7;
printf("%8.3f\n", d);
printf("%8.3f\n", e);
printf("%.3f\n", d);
printf("%.3f\n", e);
}}
#geshi(sh){{
luna% a.out
123.457
-98.700
123.457
-98.700
}}
指数形式の場合も、''%全体の文字数.小数点以下の桁数e'' の形で指定し、全体の文字数は省略できます(プログラム4、一部のみ)。
#geshi(c){{
double d = 123.456789, e = -98.7;
printf("%12.3e\n", d);
printf("%12.3e\n", e);
}}
#geshi(sh){{
luna% a.out
1.235e+02
-9.870e+01
}}
**演習2 [#i822a188]
プログラム1をプログラム2から4に変更し、実行結果を確認せよ。
**ゼロ埋め [#rf97702b]
桁数の前に ''0'' をつけると、0で埋めて表示されます(プログラム5、一部のみ)。
#geshi(c){{
int i = 12345, j = -987;
printf("%08d\n", i);
printf("%08d\n", j);
}}
#geshi(sh){{
luna% a.out
00012345
-0000987
}}
**演習3 [#m9097e33]
プログラム2をプログラム5に変更し、実行結果を確認せよ。
**符号 [#g3ae279e]
''%'' の後ろに ''+'' をつけると、符号が常に出力されます(プログラム6、一部のみ)。
#geshi(c){{
int i = 12345, j = -987;
printf("%+d\n", i);
printf("%+d\n", j);
}}
#geshi(sh){{
luna% a.out
+12345
-987
}}
''%'' の後ろに空白を入れると、値が正のときは + の代わりに空白が出力されます(プログラム7、一部のみ)。
#geshi(c){{
int i = 12345, j = -987;
printf("% d\n", i);
printf("% d\n", j);
}}
#geshi(sh){{
luna% a.out
12345
-987
}}
**演習4 [#k571bfc3]
プログラム5をプログラム6、7に変更し、実行結果を確認せよ。
*左詰め [#y8c55e47]
''%'' の後ろに ''−'' をつけると、左詰めで出力されます(プログラム8、一部のみ)。
#geshi(c){{
int i = 12345, j = -987;
printf("+--------+--------+\n");
printf("|%-8d|%-8d|\n", i, j);
printf("+--------+--------+\n");
}}
#geshi(sh){{
luna% a.out
+--------+--------+
|12345 |-987 |
+--------+--------+
}}
**演習5 [#pd2bdeba]
プログラム7をプログラム8に変更し、実行結果を確認せよ。
*エスケープ・シーケンス [#j74b962a]
ダブル・クオーテーション ''"'' や改行など、文字列の中で普通に表すことができない文字を表すには、''エスケープ・シーケンス''を使います。
エスケープ・シーケンスは、バック・スラッシュ ''\'' で始まる文字列で、次のようなものがあります。
|エスケープ・シーケンス|意味|h
|\n|改行|
|\t|タブ|
|\b|バック・スペース|
|\"|ダブル・クオーテーション|
|\'|シングル・クオーテーション|
|\\|バック・スラッシュ|
これらはプログラムの中では2文字になっていますが、1文字を表しています。
次のプログラムは、ダブル・クオーテーションで囲まれた文字列を出力するプログラムです(プログラム9、一部のみ)。
#geshi(c){{
printf("\"Hello World!\"\n");
}}
このプログラムを実行すると、次のように表示されます。
#geshi(sh){{
luna% a.out
"Hello World!"
}}
**演習6 [#o30276f9]
プログラム9を作成し、実行結果を確認せよ。
----
*fflush関数(おまけ) [#x9ff53b8]
printf関数は、バッファー(一時的に情報をためておく場所)に出力する文字列をためておき、バッファーをフラッシュすると文字列が出力されるという仕組みになっています。
バッファーは、改行すると自動的にフラッシュされます。
つまり、改行しないとバッファーがフラッシュされず、バッファーにたまっている文字列は出力されません。
(プログラムの実行が終了したときなど、改行以外にもバッファーが自動的にフラッシュされることはあります。)
これを、''sleep関数''を使って確認してみます。
sleep関数は、( ) の中に指定された秒数だけスリープ(プログラムを一時的に停止)します(プログラム10)。
#geshi(c){{
#include <stdio.h>
int main(void) {
printf("Hello World!");
sleep(10);
printf("\n")
}
}}
このプログラムを実行すると、10秒たってから、次のように表示されます。
#geshi(sh){{
luna% a.out
Hello World!
}}
つまり、スリープしている時点では、バッファーにたまっている文字列は画面に出力されません。
''fflush関数''は、バッファーを強制的にフラッシュします。
画面に出力するためのバッファーをフラッシュするときは、fflush関数の ( ) の中に ''stdout'' と指定します。
stdoutは、''standard out''を表し、標準出力を意味します。
上のプログラムを変更し、スリープする前にバッファーを強制的にフラッシュさせます(プログラム11)。
#geshi(c){{
#include <stdio.h>
int main(void) {
printf("Hello World!");
fflush(stdout);
sleep(10);
printf("\n")
}
}}
このプログラムを実行すると、Hello World!と画面に出力されてから、10秒間スリープします。
**演習7 [#t90eb45a]
プログラム10を作成し、実行結果を確認せよ。
また、プログラム10をプログラム11に変更し、実行結果を確認せよ。
----
*まとめ [#z943f66e]
画面への出力には''printf関数''を使います。
変数を出力するときは、文字列の中に''変換指定子''を指定し、変換指定子では桁数、符号、ゼロ埋めなどが指定できます。
改行、ダブル・クオーテーション "、バック・スラッシュ \ などの特別な文字を出力するときには、''エスケープ・シーケンス''を使います。
----
*練習問題 [#ucf65fec]
**04A-1 整数の桁数(難易度★) [#nb018550]
次の空欄部分におなじ変換指定子を補って、int型の変数 x, y の値を全体10文字で表示するプログラムを完成させよ。
#geshi(c){{
int main(void) {
int x = 123, y = 45678;
printf(" \n", x);
printf(" \n", y);
return 0;
}
}}
***解答例 [#s14c15fc]
解答例は[[こちら>授業/C言語基礎/04A-1]]
**04A-2 小数点以下の桁数(難易度★) [#ya732787]
次の空欄部分を補って、double型の変数 pi の値を全体10文字、小数点以下2桁で表示するプログラムを完成させよ。
#geshi(c){{
int main(void) {
double pi = 3.141592;
printf(" \n", pi);
return 0;
}
}}
***04A-2 解答例 [#sadf452e]
解答例は[[こちら>授業/C言語基礎/04A-2]]
**04A-3 複数の変換指定子の組み合わせ(難易度★★) [#b0068161]
次の空欄部分を補って、int型の変数 x の値を符号付きゼロ埋め全体8文字で表示するプログラムを完成させよ。
#geshi(c){{
int main(void) {
int x = 12345;
printf(" \n", x);
return 0;
}
}}
***04A-3 解答例 [#qbeac7bd]
解答例は[[こちら>授業/C言語基礎/04A-3]]
練習問題は[[こちら>授業/C言語基礎/画面への出力/練習問題]]。