C言語 変換指定について少しだけ詳しく解説

プログラミング

 

変換指定

これまでも何度も出てきたものです。整数の時の%dや実数の時の%fとか書いていたあれです。今回はこの変換指定についてもう少し詳しく解説していきます。

 

変換指定とは、これから処理するとある値をどう扱うかを指定するときにつかうもので、今までも整数を扱うときは%d、実数を扱うときは%fと書いてきました。

 

しかし、この変換指定にはもっと細かく値を設定することが出来る機能があります。今回説明するのはそのさらに細かい設定についてです。通常はあまり使う機会がない機能ですが、知っていて損はないのでぜひ参考にしていってください。

 

変換指定の基本構造

 

%[フラグ][最小フィールド幅].[精度][変換指定子]

 

これが変換指定の基本的な構造となります。なに書いているかよくわからないと思うので、各こうもくを一つずつ解説します。

 

変換指定子

 

変換指定子は今までも何度も出てきました。

 

変換指定子とは整数や実数、文字列などの扱う値の種類によってかわるもので、整数のdや実数のf、文字列のs、一つの文字cなどがそれに当たります。つまり今までは、それらだけをもちいた一番簡単な変換指定%dや%fを使っていたということです。

 

ここでは、整数の時に使うd、実数の時に使うfしか出てきません。

 

最小フィールド幅:表示する文字の最低個数を決める

 

今までは、%dや%fなどの一番簡単な形式の変換指定をしていましたが、実はこれは変換指定でできる機能のほとんどを省略した形にすぎません。

 

ここでは、変換指定の機能で「画面に表示する文字の最低個数」を設定します。どういうことかと言うと、この最低個数を5とした時、画面に表示することが出来る文字は全部で5個、つまり「最低5文字までは表示しますよ」と言うことです。

 

この時この設定のもと、123という3文字の数値を表示しようとすると最低5文字は表示するのに3文字じゃ足りません。この場合は5文字のうち3文字が埋まり、残りの2文字が空白として表示されます。

 

つまり、[123]ではなく、左2文字が空白の[  123]と表示されます。

 

今の例のように整数123を最小フィールド幅5で表示するときは

%5d

と書きます。5と書いてあるところが最小フィールド幅として設定した値です。

 

文で書いても少しわかりづらいかもしれないので、実際に実行した結果を見てみましょう。

 

実行結果は

 

予想通り、下の123は2つ分の空白があいた状態で表示されました。

これは別に整数だけじゃなく実数でも、%5fとすれば同じことが出来るのでぜひ試してみてください。

 

しかし、ここでこう思った人はいませんか?

 

「表示する文字数、つまり最小フィールド幅が2で、3桁ある123を表示しようとするとどうなるんだ?」と

 

この場合は、最小フィールド幅が3まで上げられます。つまり、表示しようとしているもとの値の文字数よりも最小フィールド幅が小さいときは、もとの値の文字数がそのまま最小フィールド幅の値になるので、事実上最小フィールド幅を設定していないのと変らない状態になります。

 

今出した例でいう「123を最小フィールド幅2の%2d」で表示しようとすると結果は

[123]

となるということです。

123を%dで書いたのと同じですよね。

 

次にフラグについてです。

 

0フラグ:空白を0で表示

 

見出しにも書いてある通り、フラグを用いると先ほどの最小フィールド幅であいた空白を0で埋めることが出来ます。

 

つまり%5dでは[  123]となっていたものが[00123]と表示されるようになるということです。

 

0フラグは最小フィールド幅のすぐ左に0と付けすことで設定することが出来ます。

 

例えば、整数111を最小フィールド幅60フラグを付けた状態で表示したいときは、

%06d

と書きます。

 

結果として表示されるのは、「6文字表示うち、右3文字を111で、余った左3文字を0で埋めた」

[000111]

となるわけです。

 

実際にプログラムで書いてみると、

実行結果は

 

予想通り、111のうち余った左の3文字が000で埋められました。

 

0フラグは「最小フィールド幅で余った文字を0で埋める機能」と考えていただければOKです。

また、こちらに関しても実数で%06fとすれば同じような結果が得られます。

 

次に精度についてです。

 

精度

 

精度に関しては少しややこしいです。というのも整数の時と実数の時では違うはたらきをするからです。順番に見ていきましょう。

 

整数の時

 

整数の時は、先ほどの最小フィールド幅に0フラグを付けた変換指定と同じ機能になります。

 

つまり、表示する数字の最低個数を決め、空白となる部分には0を表示するということです。

 

なので、整数111を精度6で設定すると「最小フィールド幅6で0フラグを付けた」という状態になり

[000111]

と表示されるわけです。

 

書き方は

%.[精度][変換指定子]

なので

%.6d

となります。

 

ここで忘れないでほしいのが、精度のすぐ左にある . (カンマ)です。精度をつけるときは整数や実数に関係なく、必ず必要になるので付け忘れのないようにしてください。

 

 

実際にやってみるとわかるのですが、

このようにすると結果は

 

同じ結果と言うことが分かると思います。

 

次に実数の場合です。

 

実数の時

 

実数のときは、「小数点以下第何位まで表示するか」を設定します。

 

精度は整数よりも主にこちらの実数で使うことが多いです。

 

小数点第何位までかを決め、設定をこえる桁まである場合は切り捨て、超えずにあまった桁は0で表示します。

 

つまり、「実数1.234を精度6」で設定した場合は

[1.234000]

と表示され、234以下の余った3桁は0で埋められた形となります。

 

逆に「実数1.234を精度1」で設定すると

[1.2]

と表示され、小数第一位以下の34は切り捨てられます。

 

 

実際にやってみると

 

結果は

 

予想通りですね。

 

先程もいったように、精度は一般的に実数でどこまで小数点以下を表示するかを決めるときに使われることが多い機能です。

 

これまでの変換指定を書かかないとどうなる?

 

変換指定子は必ず書きます。

 

しかし、そのほかの機能はあまりなじみのないものです。今までは書かずにきた人がほとんどだと思います。

 

では書かないとどうなるか?

 

書かないと言うことは省略したということなので、その場合、各項目にはデフォルトの値が設定されます。

 

  • 最小フィールド幅であれば、もとの文字数
  • 0フラグは書かなけらばそもそも出ないようになっています。
  • 精度は、整数の場合は1とみなされ、実数の場合は6とみなされます。

 

通常設定しなかったからといって特に不具合が起こるわけでもないので、必要のない人は省略したままで構いません。

 

最後に変換指定の機能を全部使ってみる

 

最後です。

 

今まで書いてきた変換指定の機能を全部使ってみましょう。

 

今回は、「実数567.124を最低9文字まで表示して桁が足りなかったら0で埋め、小数点以下2桁までを使いたい」という設定のもと適切な変換指定作っていきます。

 

まずは、変換指定子、

実数を扱うのでfで問題ないでしょう。

つまり「%f」です。

 

次に、最低9文字まで表示したいということで、最小フィールド幅を9にすればよさそうです。

つまり「%9f」です。

 

次に、最小フィールド幅で余った文字の部分は0で表示すると言うことで、これには0フラグを使いましょう。

つまり「%09f」です。

 

最後に、小数点以下を2桁まで表示するので、精度は2ですね。

つまり「%09.2f」です。

 

出来ました。

この変換指定「%09.2f」を実行すれば目的の結果が得られそうです。実際に実行してみましょう。

 

 

実行結果は

 

見てみると、000567で6文字、小数点の . で1文字、小数点以下の12で2文字なので合計9文字となり最小フィールド幅9は満たしています。

そして小数点以下は第2位で止まり、それ以下は切り捨てられているので精度もOK。

ここまでで567.12です。

最後に、最小フィールド幅9から567.12の文字数6を引いたのこりの3文字が、000で埋められています。0フラグもOKです。

 

ここで注意したいのは、最小フィールド幅としてカウントした文字は小数点の .(カンマ)も含むという点です。

 

つまり、この時最小フィールド幅を6とすると567.12で6文字を使ってしまうので、0フラグを書いても0は表示されません。

 

少しややこしいかもしれませんが、「最小フィールド幅はあくまでも文字をカウントする」ということを特に気を付けてください。

 

長くなってしましましたが、以上が変換指定に関するちょっとくわしいお話でした。

では。

コメント