前回まででC言語の文法や構文のようなものはひと通り説明し終えました。今回の記事ではおまけとしてprintf関数やscanf関数で用いられているフォーマット指定子について焦点を当てたお話をしていきます。
前回の復習
前回の記事では例外処理について勉強しましたね。実行したときに発生するかもしれないエラーに備えて処理を組んだプログラムをみてもらいました。
詳しくは前回の記事例外処理【C言語講座 #18】を参照して下さいね。
それぞれの関数について見直したい方はよく使う標準関数【C言語講座 #17】を参照して下さい。
フォーマット指定子
フォーマット指定子については第8回の記事で簡単に紹介しました。その記事の中で以下のような表を用いてprintf関数とscanf関数に用いられるフォーマット指定子の違いについて焦点を当てた説明をしてきました。
変数の型 | 出力用フォーマット指定子 | 入力用フォーマット指定子 |
---|---|---|
char型 | %c | %c |
short型 | %d | %hd |
int型 | %d | %d |
long型 | %ld | %ld |
float型 | %f | %f |
double型 | %f | %lf |
文字列(char*型) | %s | %s |
以下ではprintf関数に用いる出力フォーマット指定子について補足で説明したいことがあったので、上記の表の中央列のものを対象にお話をしていきます。
突然ですが以下のプログラムを実行すると実行結果にはどのように表示されるでしょうか。
#include <stdio.h>
int main() {
double a = 1.234;
printf("%lf\n", a);
return 0;
}
実行結果
1.234000
『1.234』と答えた人が半分くらいは居ると思います。でも実際に出力されたのは『1.234000』です。同じじゃないかと言いたい気持ちは分かりますが、あくまでこれらは別の出力と捉えるべきです。こんな単純な場合でさえ出力を完全に制御(理解)できていないことが分かったことでしょう。
今回はこのような細かい出力のフォーマット部分についてお話ししていきます。
それでは先程のサンプルコードの出力を『1.234』になるようにprintf関数の中にあるフォーマット指定子に細工をしてみましょう。
#include <stdio.h>
int main() {
double a = 1.234;
printf("%5.3lf\n", a);
return 0;
}
実行結果
1.234
5行目のprintf関数に使われているフォーマット指定子を『%lf』から『%5.3lf』に変えただけのコードです。これをすることで最大5桁(小数点も1つとして数える)を表示してそのうち3桁は小数点以下の表示をするというフォーマット指定子になります。
サンプルプログラムを改変して様々なフォーマット指定子を手元で試してみるとわかりやすいと思います。
このようにフォーマット指定子という名前の通りフォーマットに沿った出力をさせることが可能となるわけです。ここからは具体的に整数型(int)、実数型(double)、文字列(char *)の3つを順番に見てもらいます。
int型(%d)
まずは手始めにint型からみていきましょう。
int型の場合は整数を扱う型なので、桁数の指定は以下のようにシンプルに書けます。
#include <stdio.h>
int main() {
int number = 123;
printf("%5d\n", number); //5桁で表示
printf("%05d\n", number); //5桁で表示して空の位を'0'で埋める
return 0;
}
実行結果
123
00123
int型については特に問題なく理解できると思います。
double型(%lf)
次はdouble型の場合について見ていきます。『tc1901.c』と『tc1902.c』で触れたように小数の場合は全体の桁数と小数点以下の桁数の2つを指定する必要があります。例えば『12.34000』と表示したい場合はフォーマット指定子を『%8.5lf』のように『%全体の桁数.小数点以下の桁数lf』としてあげる必要があります。この時小数点自体も一桁と数えることに注意して下さい。
サンプルコードを通して理解を深めておきましょう。
#include <stdio.h>
int main() {
double temp = 23.5;
printf("%5.2lf\n", temp); //xx.xxで表示
printf("%07.2lf\n", temp); //xxxx.xxで表示して空の位を'0'で埋める
return 0;
}
実行結果
23.50
0023.50
要点を抑えておけばここまでは概ね感覚的にも分かりやすいと思います。
char *型(%s)
少し厄介な文字列です。とはいえ文字列のフォーマットを整えることができるメリットはかなり大きいので是非習得してこの講座を卒業しましょう!!
文字列の場合は以下の3つ(5行目~7行目)を抑えておけば大丈夫です。ひとつずつ確認してみましょう。
#include <stdio.h>
int main() {
char msg[] = "This is a pen.";
printf("%20s\n", msg);
printf("%.10s\n", msg);
printf("%15.10s\n", msg);
return 0;
}
実行結果
This is a pen.
This is a
This is a
5行目の『%20s』は見たままの通り最終的に表示される文字数を指します。
6行目の『%.10s』は変数から10文字分だけ取り出して表示するよう指定しています。但しここで指定しているのは最大文字列長のため『%.100s』みたいに文字列の大きさを超えて指定しても普通の『%s』と同様の処理になります。
7行目の『%15.10s』は変数から10文字だけ取り出して15文字分の表示をしています。5行目と6行目の合わせ技と考えて貰えばどんなフォーマットになるか想像できるでしょう。
左詰め指定
これまでみてきたフォーマットの整形は桁数の指定に関するものだけで、ここまでの知識だけでは空白の位置を右側に入れるか左側に入れるかといった部分がちゃんと指定できません。
そこで左詰めの指定方法について最後に簡単に触れておきます。『%xd』、『%x.xlf』、『%x.xs』(xは数字)などの指定方法を見てきましたがこれを次のように書くだけで左詰めになります。『%-xd』、『%-x.xlf』、『%-x.xs』のように『%』の直後に『-』を入れてあげます。
試しにコードを実行してみましょう。
#include <stdio.h>
int main() {
int a = 10;
double b = 2.236;
printf("%-5d\n", a);
printf("%-7.4lf\n", b);
return 0;
}
実行結果
10
2.2360
まとめ
今回の記事ではフォーマット指定子について一歩踏み込んだ説明してきました。これで出力に関しては十分な知識が身についたことでしょう。
そして今回の記事を持ってC言語講座完結になります。最後まで読んでいただいた方ありがとうございました!また機会があれば他の講座を作るかもしれませんがその時はよろしくお願いします。この講座がためになったなと感じた方は是非、友達や同僚なんかにお勧めしていただけるとサイト管理人的には嬉しかったり……。
最後まで記事を見ていただきありがとうございます。また別の記事でお会いできることを祈っております。