
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進拡張表記 | \ooo | ooo(1〜3桁の8進数)のコードを持つ文字 |
| 16進拡張表記 | \xhh | hh(任意桁の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 と同じ役割)
- ここでの * の並びは「回数の可視化」で、デバッグにも便利です。
