C言語基礎|文字列を書式化して表示

「%s だけじゃもったいない! 幅と精度で“見やすい文字列表示”を自由に整形しよう」

文字列は「そのまま」だけじゃなく、整えて見せられる

C言語で文字列を表示するとき、まずは printf で %s を使えばOKです。
でも、実際のプログラムでは「表みたいに列を揃えたい」「長すぎる文字列は途中まででいい」「左寄せ・右寄せを切り替えたい」みたいな場面がよく出てきます。

そんなときに役立つのが、printf の変換指定(幅、精度、左寄せフラグ)です。
ここを押さえると、画面表示がグッと読みやすくなりますよ。

まずは全体像:文字列の変換指定の形

変換指定の構造(文字列)

% [フラグ] [最小フィールド幅] [.精度] s

図の説明

  • フラグ:表示の寄せ方などを指定
  • 最小フィールド幅:最低この幅で表示(足りない分は空白で埋める)
  • 精度:最大何文字まで表示するか(文字列を切り詰める)
  • s:文字列として出す指定

サンプルプログラム

文字列をいろいろな書式で表示するプログラム例です。

プロジェクト名:chap9-5-1 ソースファイル名:chap9-5-1.c

// 文字列をいろいろな書式で表示する

#include <stdio.h>

int main(void)
{
    char str[] = "SAKURA";

    puts("----- 文字列の書式化表示 -----");

    printf("%s\n", str);      // そのまま
    printf("%3s\n", str);     // 最低幅3(短いと空白が入る)
    printf("%.3s\n", str);    // 3文字まで
    printf("%10s\n", str);    // 最低幅10で右寄せ
    printf("%-10s\n", str);   // 最低幅10で左寄せ

    return 0;
}

このプログラムは、同じ文字列を「幅」「精度」「左寄せ」で見た目を変えて表示します。

実行結果のイメージ(何が起きてる?)

出力結果と意味(str = "SAKURA")

書式出力のイメージ何が起きる?
%sSAKURAそのまま全部表示
%3sSAKURA幅3は“最低”。文字列が6文字なのでそのまま
%.3sSAK最大3文字までに切り詰め
%10s(空白4個)SAKURA幅10になるまで左側に空白、右寄せ
%-10sSAKURA(空白4個)幅10になるまで右側に空白、左寄せ

表の説明

  • 幅は「最低この幅」。文字列が長ければそのまま出ます。
  • 精度は「最大この文字数」。長い場合は途中で切れます。
  • 左寄せは - フラグで指定します。

各項目をしっかり理解しよう

変換指定子 s は何をする?

s の役割

指定子何を表示する?どこまで表示する?
s文字列配列の先頭から、最初の \0 の直前まで

表の説明
%s は「文字列として表示してね」の合図です。
Cの文字列は、\0(ナル文字)で終わる約束なので、\0 の直前までが表示されます。

最小フィールド幅(幅)は何をする?

幅のイメージ

書式str="SAKURA" のときポイント
%10s右寄せで10幅足りない分は空白で埋める
%3sそのまま文字列が長いので幅指定は影響なし

表の説明
「列を揃える」目的でよく使います。
幅10を指定すると、表示が10文字分の枠に収まるように空白が追加されます。

フラグ - は何をする?

左寄せと右寄せ

フラグ書式例寄せ方
なし%10s右寄せ(デフォルト)
-%-10s左寄せ

表の説明

  • - を付けるだけで、空白が入る位置が逆になります。表表示で便利です。

精度(.精度)は何をする?

精度で「最大何文字」を決める

書式str="SAKURA" のとき意味
%.3sSAK最大3文字だけ表示
%.10sSAKURA最大10文字までOKなので全部表示

表の説明
精度は「上限」です。長すぎる文字列を短く見せたいときに役立ちます。

幅と精度を組み合わせるともっと便利

例えば、幅10で右寄せしつつ、最大3文字までにしたいならこうです。

幅と精度の合体

%10.3s
  • まず最大3文字までにする → SAK
  • その結果を幅10で右寄せ → (空白7個)SAK

命令の書式と「何をする命令か」

ここで出てくるのは主に printf と puts です。

printf の書式と役割

  • 書式
    printf(書式文字列, 実引数1, 実引数2, ...);
  • 何をする?
    書式文字列に従って、値を整形して標準出力へ表示します。
    文字列なら %s を使い、幅や精度、寄せ方も指定できます。

puts の書式と役割

  • 書式
    puts(文字列);
  • 何をする?
    文字列を表示して、最後に改行を付けます。
    書式化はできませんが、見出し表示などに気軽に使えます。

注意ポイント(つまずきやすい所だけ先に押さえる)

よくある注意

注意何が起きる?対策
%s は \0 までしか出ない途中に \0 があるとそこで止まる文字列の中身を意識する
精度なしで %s\0 がないと暴走しやすい必ず \0 で終わらせる
幅は“最低”長い文字列は切れない切りたいなら精度を使う

表の説明
幅だけでは文字列は短くなりません。短くしたいときは精度が必要です。