C言語基礎|エスケープシーケンス

「\n だけじゃない!“見えない文字”を味方にすると、表示が一気に読みやすくなる」

エスケープシーケンスは“文字の裏ワザ”じゃなくて、表示を整える基本技

C言語で文字列を表示するとき、改行やタブ、引用符など、そのまま書けない・見えない文字が出てきます。
そんなときに使うのが エスケープシーケンス(拡張表記) です。

たとえば、

  • 文字列を改行したい → \n
  • 表をタブで揃えたい → \t
  • 文字列の中に " を入れたい → "
  • 1文字の ' を表したい → '

みたいに、\(バックスラッシュ)で始まる特別な書き方で表現します。

この記事では、単純拡張表記・引用符の扱い・8進/16進拡張表記まで、表と図でしっかり整理しますね。

エスケープシーケンスとは何か

エスケープシーケンスは、文字列リテラルや文字定数の中で、特別な意味を持つ文字を表す書き方です。

エスケープシーケンスのイメージ

説明
見た目は2文字(\ と n)でも、プログラム内部では「改行1文字」として扱われます。

単純拡張表記(よく使うやつ)

単純拡張表記(simple escape sequence)

表記意味どんなとき使う?
\n改行行を変える
\t水平タブ表の列を揃える
\r復帰行の先頭に戻る(上書き表示など)
\b後退1文字戻す(扱いは環境依存が多い)
\a警報ビープ音などの通知(鳴らない環境もある)
\f書式送り改ページ(今は使われにくい)
\v垂直タブ縦方向のタブ(使われにくい)
\逆斜線\ を表示したい
?疑問符? を安全に書きたいとき(特例的)
'単一引用符' を文字として入れたい
"二重引用符" を文字として入れたい

表の説明
実務で頻出なのは \n \t \ " ' あたりです。まずはここを押さえると強いです。

サンプルプログラム

例:タブで揃え、引用符も表示するミニレポート

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

#include <stdio.h>

int main(void)
{
    puts("ミニレポートを表示します。\n");

    printf("項目\t値\n");
    printf("名前\t\"C入門\"\n");
    printf("区切り\t\\t はタブ\n");
    printf("改行\t\\n は改行\n");
    printf("一言\tIt\'s fun!\n");

    return 0;
}

実行例(イメージ)

ミニレポートを表示します。

項目    値
名前    "C入門"
区切り  \t はタブ
改行    \n は改行
一言    It's fun!

図で理解:\t と \n は表示を整える道具

\t と \n の役割(イメージ)

\t:列をそろえる(次のタブ位置へ)
\n:行を変える(次の行の先頭へ)

説明
printf で表っぽく出したいとき、\t は簡単に列を揃えられる便利アイテムです。
\n は行の区切りで、表示の読みやすさを作る基本です。

引用符の扱い:文字列と文字定数でルールが違う

ここ、最初につまずきやすいポイントなので表にします。

文字列リテラルと文字定数での引用符ルール

場所" を入れたい' を入れたい
文字列リテラル "..."" を使うのが安全' はそのままでもOK(必要なら ' でもOK)
文字定数 '...'" はそのままでもOK(" でもOK)' を使う(そのままは書けない)

表の説明

  • 文字列は " で囲むので、内部に " を書くなら " が必要です。
  • 文字定数は ' で囲むので、内部に ' を書くなら ' が必要です。

具体例:文字列の中で " を表示する

文字列に " を入れる例

表示したい文字列: "ABC"
書き方: \"ABC\"

説明
文字列の区切りとして " を使っているので、中身の " はエスケープして区別します。

8進拡張表記と16進拡張表記(コードで文字を書く)

「このコードの文字を出したい」というときに使えるのがこれです。

数値で文字を表す拡張表記

種類形式意味
8進拡張表記\oooooo(1〜3桁の8進数)のコードを持つ文字
16進拡張表記\xhhhh(任意桁の16進数)のコードを持つ文字

表の説明
数値で指定できて便利そうに見えますが、文字コード体系に依存しやすく、可搬性を落としがちです。

例:数字文字 1 をコードで書く(例として)

コード表記の例(環境により異なる可能性あり)

'1' をコードで書く例
8進:\61
16進:\x31

説明
この表記は「その環境の文字コードでその値が '1' を意味する」ことが前提になります。
だから、普段は '1' のように素直に書くほうが安全です。

可搬性の話:数字は保証があるが、アルファベットは保証がない場合がある

数字文字は '0'〜'9' が 1ずつ増える、という関係が保証されています。
一方で、英大文字 'A'〜'Z' や英小文字 'a'〜'z' が必ず連続しているとは限らない、という考え方が出てきます。

連続性の保証(考え方の整理)

文字の並び1ずつ増える関係が成り立つ?コメント
'0'〜'9'成り立つ文字→数値変換でよく使う
'A'〜'Z'成り立たない環境があるコード体系によっては崩れる場合がある
'a'〜'z'成り立たない環境がある同上

表の説明
数字はプログラムで扱う頻度が高いので、C言語として扱いやすい性質が保証されています、という理解でOKです。

登場する命令・構文の書式と役割(この記事で使ったもの)

puts の書式

int puts(const char *s);

何をする?
文字列を表示し、最後に改行も出します。手軽に1行出したいときに便利です。

printf の書式

int printf(const char *format, ...);

何をする?
書式に従って表示します。改行やタブなどのエスケープシーケンスを混ぜて、見やすい整形ができます。

演習問題

演習8-10:数字文字の出現回数を * のグラフで表示せよ

標準入力から文字を読み込み、数字文字 0〜9 の出現回数を数え、回数ぶん * を並べて表示するプログラムを作成せよ。

解答例

プロジェクト名:chap8-14-2 ソースファイル名:chap8-14-2.c

#include <stdio.h>

int main(void)
{
    int ch;
    int cnt[10] = {0};

    puts("文字列を入力してください(終了は Ctrl+D または Ctrl+Z)。");

    while ((ch = getchar()) != EOF) {
        if ('0' <= ch && ch <= '9')
            cnt[ch - '0']++;
    }

    puts("数字文字の回数グラフ");
    for (int i = 0; i < 10; i++) {
        printf("%d: ", i);
        for (int k = 0; k < cnt[i]; k++)
            putchar('*');
        putchar('\n');
    }

    return 0;
}

解説

  • '0'〜'9' の判定と cnt[ch - '0']++ は、文字コードの規則を活かした安全な書き方です。
  • putchar('\n') は改行の出力(エスケープシーケンス \n と同じ役割)
  • ここでの * の並びは「回数の可視化」で、デバッグにも便利です。