授業/C言語基礎/画面への出力 のバックアップ(No.4)


printf関数

画面に出力するには、printf関数を使います。

printf関数は、標準入出力ライブラリーのヘッダー・ファイル stdio.h の中に定義されていて、このライブラリーを読み込まないと使えません。

ライブラリーを読み込むには、 #include を使い、< > の中にヘッダー・ファイルの名前を指定します。 (ライブラリーについては、後日、詳しく勉強します。)

printfは、print formattedを表していて、書式付き出力という意味です。

printf関数は、( ) の中に出力する文字列を指定します。

  printf(文字列);

変数の値を出力するときは、文字列の中に下で説明する変換指定子を入れておき、文字列の後にコンマで区切って変数の名前を指定します。

  printf(文字列, 変数1, 変数2, ...);

変換指定子

printf関数の中で書式(フォーマット)を指定するものを変換指定子といいます。

変換指定子は、% の記号で始まる文字列で表されます。

整数・小数を出力する

整数を出力するときは %d、小数を出力するときは %f、小数を指数形式で出力するときは %e を変換指定子として用います。

たとえば、整数と小数を出力するプログラムは、次のようになります(プログラム1)。

#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;
}

このプログラムを実行すると、次のようになります。

luna% a.out
12345
123.456789
1.234568e+02

演習1

プログラム1を作成し、実行結果を確認せよ。

桁数を指定する

桁数は、%桁数d の形で指定します(プログラム2、一部のみ)。

  int i = 12345, j = -987;

  printf("%8d\n", i);
  printf("%8d\n", j);
luna% a.out
   12345
    -987

小数の場合は、%全体の文字数.小数点以下の桁数f の形で指定します。 全体の文字数を省略して、小数点以下の桁数だけでも指定できます(プログラム3、一部のみ)。

  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);
luna% a.out
 123.457
 -98.700
123.457
-98.700

指数形式の場合は、%.小数点以下の桁数e の形で指定します(プログラム4、一部のみ)。

  double d = 123.456789, e = -98.7;

  printf("%12.3e\n", d);
  printf("%12.3e\n", e);
luna% a.out
   1.235e+02
  -9.870e+01

演習2

プログラム1をプログラム2から4に変更し、実行結果を確認せよ。

ゼロ埋め

桁数の前に 0 をつけると、0で埋めて表示されます(プログラム5、一部のみ)。

  int i = 12345, j = -987;

  printf("%08d\n", i);
  printf("%08d\n", j);
luna% a.out
00012345
-0000987

演習3

プログラム2をプログラム5に変更し、実行結果を確認せよ。

符号

% の後ろに + をつけると、符号が常に出力されます(プログラム6、一部のみ)。

  int i = 12345, j = -987;

  printf("%+d\n", i);
  printf("%+d\n", j);
luna% a.out
+12345
-987

% の後ろに空白を入れると、値が正のときは + の代わりに空白が出力されます(プログラム7、一部のみ)。

  int i = 12345, j = -987;

  printf("% d\n", i);
  printf("% d\n", j);
luna% a.out
 12345
-987

演習4

プログラム5をプログラム6、7に変更し、実行結果を確認せよ。

左詰め

% の後ろに をつけると、左詰めで出力されます(プログラム8、一部のみ)。

  int i = 12345, j = -987;

  printf("+--------+--------+\n");
  printf("|%-8d|%-8d|\n", i, j);
  printf("+--------+--------+\n");
luna% a.out
+--------+--------+
|12345   |-987    |
+--------+--------+

演習5

プログラム7をプログラム8に変更し、実行結果を確認せよ。

エスケープ・シーケンス

ダブル・クオーテーション " や改行など、文字列の中で普通に表すことができない文字を表すには、エスケープ・シーケンスを使います。

エスケープ・シーケンスは、バック・スラッシュ \ で始まる文字列で、次のようなものがあります。

エスケープ・シーケンス意味
\n改行
\tタブ
\bバック・スペース
\"ダブル・クオーテーション
\'シングル・クオーテーション
\\バック・スラッシュ

これらはプログラムの中では2文字になっていますが、1文字を表しています。

次のプログラムは、ダブル・クオーテーションで囲まれた文字列を出力するプログラムです(プログラム9、一部のみ)。

  printf("\"Hello World!\"\n");

このプログラムを実行すると、次のように表示されます。

luna% a.out
"Hello World!"

演習6

プログラム9を作成し、実行結果を確認せよ。

fflush関数(おまけ)

printf関数は、バッファー(一時的に情報をためておく場所)に出力する文字列をためておき、バッファーをフラッシュすると文字列が出力されるという仕組みになっています。

バッファーは、改行すると自動的にフラッシュされます。 つまり、改行しないとバッファーがフラッシュされず、バッファーにたまっている文字列は出力されません。 (プログラムの実行が終了したときなど、改行以外にもバッファーが自動的にフラッシュされることはあります。)

これを、sleep関数を使って確認してみます。 sleep関数は、( ) の中に指定された秒数だけスリープ(プログラムを一時的に停止)します(プログラム10)。

#include <stdio.h>

int main(void) {
  printf("Hello World!");
  sleep(10);
  printf("\n")
}  

このプログラムを実行すると、10秒たってから、次のように表示されます。

luna% a.out
Hello World!

つまり、スリープしている時点では、バッファーにたまっている文字列は画面に出力されません。

fflush関数は、バッファーを強制的にフラッシュします。 画面に出力するためのバッファーをフラッシュするときは、fflush関数の ( ) の中に stdout と指定します。 stdoutは、standard outを表し、標準出力を意味します。

上のプログラムを変更し、スリープする前にバッファーを強制的にフラッシュさせます(プログラム11)。

#include <stdio.h>

int main(void) {
  printf("Hello World!");
  fflush(stdout);
  sleep(10);
  printf("\n")
}  

このプログラムを実行すると、Hello World!と画面に出力されてから、10秒間スリープします。

演習7

プログラム10を作成し、実行結果を確認せよ。 また、プログラム10をプログラム11に変更し、実行結果を確認せよ。

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS