3.printfを使いこなそう

3-7. フィールド幅

◆フィールド幅

-フィールド幅とは?

まず、今までどおりの方法で3×3の行列を表示してみます。

#include<stdio.h>
main()
{
    int i,j;
    int matrix[3][3]={{12,34,46},
                      {643,2,45},
                      {435,34,2545}};
    for(i=0;i<3;i++){
        for(j=0;j<3;j++)printf("%d ",matrix[i][j]);
        printf("\n");
        }
}

結果:
12 34 46
643 2 45
435 34 2545

これでは、各要素が揃ってないので見づらいですね。

スペースで揃えればこの場合何とかなりますが、配列の数値が未知数だとうまくできません。

そこで必要なのがフィールド幅の指定です。

#include<stdio.h>
main()
{
    int i,j;
    int matrix[3][3]={{12,34,46},
                      {643,2,45},
                      {435,34,2545}};
    for(i=0;i<3;i++){
        for(j=0;j<3;j++)printf("%4d ",matrix[i][j]);
        printf("\n");
        }
}

% と d の間に 4 を入力しました。これがフィールド幅の指定で、これを実行すると、

結果:
  12   34   46
 643    2   45
 435   34 2545

となり、きれいに表示されました。この 4 の意味は『4桁の幅で表示』になります。もし、このときに数値が4桁を超えたばあいはその数値のみそのまま表示されます。

#include<stdio.h>
main()
{
    int i,j;
    int matrix[3][3]={{12,34,46},
                      {687643,2,45},
                      {435,34,2545}};
    for(i=0;i<3;i++){
        for(j=0;j<3;j++)printf("%4d ",matrix[i][j]);
        printf("\n");
        }
}
結果:
  12   34   46
687643    2   45
 435   34 2545

2行目のはじめの数値が6桁なのでそれ以降右側はズレてしまいました。

今から整数型以外でのフィールド幅について確認も含めてやってみます。

◇%f の場合

#include<stdio.h>
main()
{
    int i,j;
    double matrix[3][3]={{12.33,34.2,46.456},
                      {687643.44,2.3,45.1},
                      {435.4,3.4,25.45}};
    for(i=0;i<3;i++){
        for(j=0;j<3;j++)printf("%15f ",matrix[i][j]);
        printf("\n");
        }
}

結果:

      12.330000       34.200000       46.456000
  687643.440000        2.300000       45.100000
     435.400000        3.400000       25.450000

◇%e の場合

#include<stdio.h>
main()
{
    int i,j;
    double matrix[3][3]={{12.33,34.2,46.456},
                      {687643.44,2.3,45.1},
                      {435.4,3.4,25.45}};
    for(i=0;i<3;i++){
        for(j=0;j<3;j++)printf("%15e ",matrix[i][j]);
        printf("\n");
        }
}

結果:

  1.233000e+001   3.420000e+001   4.645600e+001
  6.876434e+005   2.300000e+000   4.510000e+001
  4.354000e+002   3.400000e+000   2.545000e+001

◇%g の場合

#include<stdio.h>
main()
{
    int i,j;
    double matrix[3][3]={{12.33,34.2,46.456},
                      {687643.44,2.3,45.1},
                      {435.4,3.4,25.45}};
    for(i=0;i<3;i++){
        for(j=0;j<3;j++)printf("%15g ",matrix[i][j]);
        printf("\n");
        }
}

結果:

          12.33            34.2          46.456
         687643             2.3            45.1
          435.4             3.4           25.45

◇%s の場合

#include<stdio.h>
main()
{
    int i;
    char str[3][12]={"おはよう","こんにちは","こんばんは"};
    for(i=0;i<3;i++){
        printf("%15s ",str[i]);
        printf("\n");
        }
}

結果:

       おはよう
     こんにちは
     こんばんは

となり変換型に関係なく15文字分の領域を確保して右端をそろえた状態で出力されます。

◇アスタリスクを使ったフィールド幅指定

早速ですが、例を下に示します。

#include<stdio.h>
main()
{
    int i;
    for(i=1;i<10;i++)printf("%*d",2,i);
 }

結果:

 1 2 3 4 5 6 7 8 9

このようにアスタリスクを使うとそのアスタリスクに対応する整数型の定数(変数)をフィールド幅として定義します。

これは、フィールド幅を変数の値によって決めたいときに有効な方法です。

ですから、以下のような事がアスタリスクによってできます。

#include<stdio.h>
main()
{
    int i;
    for(i=1;i<10;i++)printf("%*d\n",i,i);
 }

結果:

1
 2
  3
   4
    5
     6
      7
       8
        9