C 言語で printf 関数で列を揃える

胡金庫 2023年10月12日
  1. C 言語で出力を整列させるために %{integer}d 記法を使用する
  2. C 言語で出力を整列させるために %*d 記法を使用する
  3. 表のカラムを整列させるために %*d%{int}d 記法を使用する
C 言語で printf 関数で列を揃える

この記事では、C 言語の printf 関数のカラムを整列させる方法について複数の方法を紹介します。

C 言語で出力を整列させるために %{integer}d 記法を使用する

printf は標準 I/O ライブラリの一部であり、フォーマットされた文字列を stdout ストリームに出力するために利用することができます。ストリームはバッファリングされているので、文字列に改行文字が含まれていない場合は遅延が発生する可能性があります。通常、与えられた文字列は内部バッファが一杯になるまで出力されず、その時点で初めて stdout ストリームに内容が書き込まれます。

printf は文字列の書式設定を制御するために % で始まる書式指定子を使用します。組み込みのデータ型に対応するさまざまな指定子に加えて、シンボルによっては整列やパディングのようなさまざまな機能を追加することができます。この場合、% と書式指定子文字の間に整数を挿入して、出力項目の左側の空白の数を指定します。その結果、複数の行の出力に対して同じ数を含めることで、項目を右側に揃えることができます。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char const *argv[]) {
  int mm1 = 11011;
  int mm2 = 111;
  int mm3 = 11;

  printf("%10d %d\n", mm1, mm1);
  printf("%10d %d\n", mm2, mm2);
  printf("%10d %d\n", mm3, mm3);

  exit(EXIT_SUCCESS);
}

出力:

11011 11011
  111 111
   11 11

C 言語で出力を整列させるために %*d 記法を使用する

あるいは、%*d 記法を使用して同じ書式設定を行うこともできますが、これはさらに、データ引数としてカンマの後に整数を指定する必要があります。ただし、複数の書式指定子が % 文字を含む場合は、対応する引数の前に別の整数値を含める必要があることに注意してください。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char const *argv[]) {
  int mm1 = 11011;
  int mm2 = 111;
  int mm3 = 11;

  printf("%*d %d\n", 10, mm1, mm1);
  printf("%*d %d\n", 10, mm2, mm2);
  printf("%*d %d\n\n", 10, mm3, mm3);

  exit(EXIT_SUCCESS);
}

出力:

11011 11011
  111 111
   11 11

表のカラムを整列させるために %*d%{int}d 記法を使用する

最後に、異なるシナリオで両方の方法を組み合わせて、任意のテキストテーブル出力で列を整列させることができます。時には、列のエントリを左に揃えなければならないことがあることに注意してください。これは、書式指定子の間に負の整数値を挿入するか、%*d 記法で引数として渡すことで実現できます。後者の方法は、パディングが一定ではなく、実行時に動的に計算できる場合に適しています。

#include <stdio.h>
#include <stdlib.h>

#ifndef MAX
#define MAX 10
#endif

int main(int argc, char const *argv[]) {
  char *row1[] = {"num", "name", "sum"};
  int col1[] = {1, 2, 3};
  char *col2[] = {"one", "two", "three"};
  int col3[] = {1243, 14234, 3324};

  printf("%*s | %*s | %*s\n", -3, row1[0], -MAX, row1[1], MAX, row1[2]);
  printf("%*c | %*c | %*c\n", -3, '-', -MAX, '-', MAX, '-');
  size_t len = sizeof col1 / sizeof col1[0];
  for (int i = 0; i < len; ++i) {
    printf("%-3d | %-10s | %10d\n", col1[i], col2[i], col3[i]);
  }

  exit(EXIT_SUCCESS);
}

出力:

num | name       |        sum
-   | -          |          -
1   | one        |       1243
2   | two        |      14234
3   | three      |       3324
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C IO