printfの様々な書式指定①(数値の場合)

桁数の指定

printf()関数の書式指定で%dを指定すると整数を表示できましたが、次のように、桁数を指定することも可能です。

整数の桁ぞろえ

printf-ex1:main.c
#include <stdio.h>

void main(){
	printf("%05d¥n", 100);	//	5桁で100を表示(空白部分は0で埋める)
	printf("%5d¥n", 100);	//	5桁で100を表示(空白部分はスペースで埋める)
}
実行結果
00100
   100

%dの前に、数値を書けば、その桁に合わせて数値を表示します。また、さらにその数値の前に、0を入れれば、空白部分に0を入れた数値が表示されます。

実数の桁ぞろえ

続いて、実数の桁ぞろえのケースを見て見ましょう。実数の場合は、小数点以下の値もあるので、そちらもあわせて設定しておく必要があります。

printf-ex2:main.c
#include <stdio.h>

void main(){
	//	空白部分に0がつかないケース
	printf("%10.2f¥n",123.456);	//	全10桁。小数点以下2桁
	printf("%10.3f¥n",123.456);	//	全10桁。小数点以下3桁
	printf("%10.4f¥n",123.456);	//	全10桁。小数点以下4桁
	//	空白部分に0がつくケース
	printf("%010.02f¥n",123.456);	//	全10桁。小数点以下2桁
	printf("%010.03f¥n",123.456);	//	全10桁。小数点以下3桁
	printf("%010.04f¥n",123.456);	//	全10桁。小数点以下4桁
}
実行結果
0000123.46
000123.456
00123.4560
0000123.46
000123.456
00123.4560

まずは、5行目から7行目のケースを見てください。最初に来る桁数が、全体の桁数を表します。この場合、小数点を含んだ実数を、すべて10桁であらわすことを意味します。そして、.(ピリオド)以下の数値が、小数点以下の桁数です。%10.4fとすれば、小数点以下は4桁であらわされます。

5行目の結果からわかるとおり、小数点以下の位が少ない場合は、四捨五入され、逆にあまる場合は、余った部分に0が表示されます。

9行目から、12行目は、先頭に0がつくケースです。考え方は、整数の場合と一緒です。

printfの様々な書式指定②(文字列の場合)

文字列の表示方法の指定

文字列の場合も、同様に様々な操作ができます。文字列の表示は、%sを使いますが、この場合も先頭に様々な記述をすることにより、色々な表示方法が実現できます。まずは、以下のサンプルを見てください。

printf-ex3:main.c
#include <stdio.h>

void main(){
	printf("%10s¥n", "ABCDE");		//	右詰め10文字(余りは空白)
	printf("%-10s¥n", "ABCDE");		//	左詰め10文字(余りは空白)
	printf("%.2s¥n", "ABCDE");		//	先頭2文字のみ表示
}
実行結果
00000ABCDE
ABCDE
AB

%とsの間に、「10s」と指定することで、10文字の文字列の中で、右詰めで文字列が表示されます。文字列のない部分は、空白で補完されます。また、「-10s」とすれば、10文字での左詰めです。さらに「.2s」とすることで、文字列の先頭2文字のみが表示されています。このようにして、文字列も様々な操作をすることが可能です。

printfの様々な書式指定③(誤った型の指定)

また、printf()での型の指定は、間違いを起こしやすいので注意が必要です。明らかなエラーにはビルドエラーが出るのですが、エラーが出ない場合も少なくなく、やっかいです。そこで、ここではよくあるprintf()の間違いを紹介します。

printf-ex4:main.c
#include <stdio.h>

void main(){
	printf("%d¥n", 1, 2);	//	きちんと表示できないケース① ~ %dの数が足りない。
	printf("%d¥n");			//	きちんと表示できないケース② ~ 表示する内容がない。
	printf("%d¥", "ABCDE");	//	きちんと表示できないケース③ ~ 型が違う。
	printf("%s¥", 1);		//	きちんと表示できないケース④ ~ 実行時エラー。
}
実行結果
1
0
9328732

4行目のケースは、表示する数値に対して、%dの数が足りないようなケースです。先頭の1しか表示されません。また、5行目は、%dがあるものの、そのあとに数値が指定されていません。エラーにはなりませんが、かわりに0が表示されています。

さらに6行目と7行目は、型の違う値を指定するケースです。6行目のケースは、でたらめな値が表示されますが、7行目のようなケースは、実行時エラーが発生します。このように、printf()の書式の使い方を誤ると、ビルドエラーは出ないものの、思いかけない動作をしたり、プログラムが異常終了したりしますので、気をつけましょう。