第1日目から使用した printf
は、
プログラムからの出力を行うための手段の一つで、指示された内容を画面に表示することができる。
次のプログラムで printf
の働きを確認してみよう。
/* printf-test.c */ #include <stdio.h> main () { printf("Hello C world\n"); printf("2gyome %d\n", 10); printf("%d 3gyome\n", 10 + 20); printf("4gyome %d ushiro\n", 1 + 2 * 3); printf("1banme=%d 2banme=%d\n", 10, 1 + 2 * 3); }
実行してみると二重引用符(Double quotaion, ")の間の部分が表示されることと、 その中に出現する "%d" の部分は後ろに与えられた式の値に置き換えられている事が分かる。 さらに、"%" が複数ある場合、後ろに与えられた式が順に置き換えられていることも分かる。
[user99@proge1]~% ./printf-test ~/www/fpu/ProgrammingE/src Hello C world 2gyome 10 30 3gyome 4gyome 7 ushiro 1banme=10 2banme=7 [user99@proge1]~%
printf
は、書式(format)と表現したいものを指定すると、
書式にしたがって表示する働きを持っている。
printf の機能を使うと、変数の中に入っている値を参照する事が簡単にできる。
たとえば、変数 i
の中身を 「i =
」 の後ろに2桁で表示したい場合は
次のように書けば良い。
この % から始まる文字列のことを書式指定とよぶ。
書式指定はman 3 printf
として参照できるマニュアルに現れる言葉に従うと
%[フラグ文字][フィールド幅][. 精度][長さ修飾子]変換指定子
と書くことができる。
省略可能。
省略された場合は、出力は左詰め、数値が入らない桁は空白、 正符合は出力されない。
省略可能。省略された場合は、出力に必要な桁数で表示される。
出力に使用する最小の幅を10進数で指定する。 情報が出力されない桁はデフォルトでは空白文字が出力される。 もし、出力に必要な桁数が指定桁数を越えた場合は、フィールド幅は拡げられる。
省略可能。
ピリオド(".")とそれに続く10進数という形式で指定する。 整数の場合(変換指定子が d, i, o, u, x の場合)は 表示される最小の桁数を指定することになる。 実数の場合(変換指定子が e, f,g の場合)は、 小数点以下の表示桁数を指定する。
省略可能。
整数、実数型とも複数の型が存在しているので、大きさの異なる型として表現したい場合に使用する。
使い方を誤ると、意味不明の出力を得るので注意。
省略不可。
引数を表現する際にどのように変換するかを指定する。代表的なものとしては次のようなものがある。
d,i
: 符合付 10進数に変換する
o
: 符合無 8進数に変換する
u
: 符合無 10進数に変換する
x
: 符合無 16進数に変換する
f
: 固定小数点形式の10進数に変換する(ddd.dddd)
e
: 浮動小数点形式の10進数に変換する(d.dddde[+|-]dd)
g
: f もしくは、 g のうち、桁数が少ない方で表現する
c
: 符号無 char とみなして対応する文字に変換する
p
: ポインタを引数としてアドレス値を16進(%#x形式)で表現する
/* printf-test2.c */ #include <stdio.h> main() { int i; double t; i = 12; t = 314.15926535; printf("i = %d\n", i); i = 50; printf("i = %d\n", i); /* 10進数 */ printf("i = %1d\n", i); /* 最低長 1 の10進 */ printf("i = %2d\n", i); /* 最低長 2 の10進 */ printf("i = %5d\n", i); /* 最低長 5 の10進 */ printf("i = %o\n", i); /* 8進数 */ printf("i = %x\n", i); /* 16進数 */ printf("i = %c\n", i); /* 文字コード */ printf("t = %f\n", t); /* 固定小数点 */ printf("t = %e\n", t); /* 浮動小数点 */ printf("t = %6.2f\n", t); /* 桁指定固定小数点 */ printf("&t = %p\n", &t); /* アドレスの表示 */ }